歸檔,josn,plist,xml,數據庫是數據存儲的幾種重要的形式,其中歸檔是存儲對象的方式,存儲對象分爲
兩種,一種是系統對象的存儲,另一種是自定義對象的存儲,系統對象存儲比較簡單。直接調用系統給的方法
不需要重寫系統對象的方法,但是自定義對象的歸檔需要去重寫對象的兩個方法,讓系統知道你有那些數據是
需要歸檔的,那些數據是要解檔。 我們這裏創建一個Dog類 ,以它裏面的成員歸檔爲例。
Dog類:
#import <Foundation/Foundation.h>
//使用協議
//1.遵守指定的協議,規定對象如何編碼NSCoding叫做編碼協議
//2實現協議中的方法.
@interface Dog : NSObject <NSCoding>
@property NSString * nickname;
@property NSString *gender; //性別
@property float weight;
@property NSString *type;
@end
#import "Dog.h"
@implementation Dog
//重寫nsobject類的description的方法,打印對象
-(NSString*)description
{
//將對象轉化後打印對象.
return [NSString stringWithFormat:@"%@%@%f@%@",_nickname,_gender,_weight,_type];
}
//注意。自定義對象的歸檔必須去重寫encodeWithCoder,initWithCoder的兩個方法。系統對象不需要的
//如果是自定義對象,必須實現重載encodeWithCoder,initWithCoder的兩個方法告訴系統,你的對象裏面到底有那些數據。
/ /- (void)encodeWithCoder:(NSCoder *)aCoder
//- (id)initWithCoder:(NSCoder *)aDecoder
//1.歸檔
- (void)encodeWithCoder:(NSCoder *)aCoder
{//告訴系統應該怎麼樣去編碼,如果沒有加這個方法,自定義對象歸檔會崩潰
//把類中的對象指定一個key,編碼到文件中
[aCoder encodeObject:self.nickname forKey:@"nickname"];
[aCoder encodeObject:self.gender forKey:@"gender"];
[aCoder encodeObject:[NSNumber numberWithFloat:self.weight] forKey:@"weight"];
[aCoder encodeObject:self.type forKey:@"type"];
}
//2.解檔
- (id)initWithCoder:(NSCoder *)aDecoder
{//告訴系統應該怎麼樣去解碼,如果沒有加這個方法,自定義對象歸檔回崩潰
//
if(self=[super init])
{
//對數據進行解碼
self.nickname=[aDecoder decodeObjectForKey:@"nickname"];
self.gender=[aDecoder decodeObjectForKey:@"gender"];
self.weight=[[aDecoder decodeObjectForKey:@"weight"]floatValue ];
self.type=[aDecoder decodeObjectForKey:@"type"];
}
return self;
}
@end
#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
一.系統對象的歸檔
//1.1系統對象的歸檔
作用是把一個對象保存到文件中
//相比plist:plist 只能存儲簡單數據類型,不能存儲對象的複雜數據類型,歸檔可以存儲複雜數據類型
NSString *array=[[NSArray alloc]initWithObjects:@"小二",@"三少",@"四娘",@"跳舞大神", nil];
//通過歸檔的形勢存儲到文件中
//設置文件路徑path
NSString *path=@"/Users/student/Desktop/people.data";
BOOL b= [NSKeyedArchiver archiveRootObject:array toFile:path];
NSLog(@"b=%i",b);
//1.2系統對象的解檔
//解擋把對象文件恢復出來
//參數1:傳入保存對象文件
//返回保存的對象
//原來存儲的是什麼類型,就用什麼類型接受
NSArray *readarray=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
for (NSString *str in readarray) {
NSLog(@"str=%@",str);
}
二 自定義對象的歸檔
//2.1自定義類的對象的歸檔和解檔。要求必須重寫父類的encodeWithCoder,initWithCoder這兩個方法纔可以實現歸檔和解檔,否則系統無法知道你對象裏面到底有什麼樣的數據,無法歸檔和解檔,系統崩潰
Dog *huaer=[[Dog alloc]init];
huaer.nickname=@"huaer";
huaer.gender=@"gril";
huaer.weight=15;
huaer.type=@"土狗";
Dog *amiao=[[Dog alloc]init];
amiao.nickname=@"amiao";
amiao.gender=@"boy";
amiao.weight=60;
amiao.type=@"藏獒";
//2.1歸檔
//自定義的對象不能直接歸檔,直接歸檔回崩潰.
//需要告訴系統,對象應該如何歸檔.
//自己類中添加一些指定的方法
NSString *path=@"/Users/student/Desktop/dog.data";
[NSKeyedArchiver archiveRootObject:huaer toFile:path];
//NSLog(@"huaer=%@",huaer);
//2.2解檔
Dog *newDog=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@ \n %@ \n %f\n %@",newDog.nickname,newDog.gender,newDog.weight,newDog.type);
}
return 0;
}