NSKeyedArchiver归档(NSCoding)
- 如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
- 不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以
NSCoding协议有2个方法:
encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量
initWithCoder:
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量
自定义对象归档
- (IBAction)save:(id)sender {
Person *p = [[Person alloc] init];
p.age = 18;
// 获取cache
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// 获取文件的全路径
NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"];
// 把自定义对象归档
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
}
- (IBAction)read:(id)sender {
// 获取cache
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// 获取文件的全路径
NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"];
// 解档
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%d",p.age);
}
自定义对象中
遵守NSCoding协议 实现方法
// 什么时候调用:自定义对象归档的时候
// 作用:用来描述当前对象里面的哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
// name
[aCoder encodeObject:_name forKey:@"name"];
// age
[aCoder encodeInt:_age forKey:@"age"];
}
// 什么时候调用:解档对象的时候调用
// 作用:用来描述当前对象里面的哪些属性需要解档
// initWithCoder:就是用来解析文件的。
- (id)initWithCoder:(NSCoder *)aDecoder
{
// super:NSObject
//[super initWithCoder:aDecoder]当父类中有实现的时候,用父类的方法,不然用[super init]
if (self = [super init]) {
// 注意:一定要给成员变量赋值
// name
_name = [aDecoder decodeObjectForKey:@"name"];
// age
_age = [aDecoder decodeIntForKey:@"age"];
}
return self;
}