上海恩美路演iOS 开发每天分享优质文章iOS学习开发

归档 存储数据

2016-06-03  本文已影响184人  放肆肆肆

归档一般都是保存自定义对象的时候,使用归档.因为plist文件不能够保存自定义对象.

如果一个字段当中保存有自定义对象,如果把这个字典写入到文件当中 它是不会生成Plist文件的

Person*persion = [[Person alloc]init];

person.name=@"WK";

person.age=18;

获取沙盒临时目录

NSString *tempPth = NSTemporaryDirectory();

NSString *filePath = [tempPath stringByAppendingPathComponent :@"person.data"];

[NSKeyedArchiver archivRootObject:person toFile:filePath];

archiveRootObject 这个方法底层会去调用保存对象的encodeWithCoder方法,去询问要保存这个对象的那些属性.

所以要实现encodeWithCoder方法 ,告诉要保存对象的那些属性.

需要遵循<NSCoding>协议

@interfacePersion :NSObject <NSCoding>

@property (nonatomic, strong)NSString *name; 

@property (nonatomic, assign) int age;

遵循协议后可以实现方法

需要报保存对象的属性

- (void)encodeWithCoder:(NSCoder *) encode{

[encode encodeObject:self.name forKey:@"name"];

[encode encodeInt32:self.age forKey:@"age"];

}

获取沙盒临时目录

NSString *tempPath =NSTemporaryDirectory();

NSString *filePath = [tempPath stringByAppendingPathComponent:@"persion.data"];

Persion *persion = [NSKeyedUnarchiver

unarchiveObjectWithFile:filePath];

NSKeyedUnarchiver 会调用initWithCoder来让你告诉他获取对象的那些属性

所以我们要在保存的对象中实现initWithCoder方法

initWithCoder会在解析文件的时候调用

-(instancetype)initWithCoder:(NSCoder*)decoder{

//因为遵循了NSCoding协议 所以不需要[super initWithCoder];

if  (self = [super init]) {

self.age = [decoder decodeInt32ForKey:@"age"];

self.name = [decoder decodeObjectForKey:@"name"];

//需要给里面的属性赋值,外界取得对象时访问该属性,里面才会有值  

}

return self;

}

上一篇 下一篇

猜你喜欢

热点阅读