1、概述编码
NSKeyedArchiver归档和plist文件存储不一样的是NSKeyedArchiver能够直接保存对象。若是对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,能够直接用NSKeyedArchiver进行归档和恢复。不是全部的对象均可以直接用这种方法进行归档,只有遵照了NSCoding协议的对象才能够被存储。code
NSCoding协议中的2个方法:对象
(1)encodeWithCoder:继承
存对象时该方法必须实现,每次归档对象时,都会调用这个方法。通常在这个方法里面指定如何归档对象中的每一个实例变量,能够使用encodeObject:forKey:方法归档实例变量。即指定存储哪些属性和在文件中以什么名字做为key存储这些属性。例如:it
[encode encodeObject:_name forKey:@”name”];io
系统下次从文件中取_name的值就自动用name这个key去取,后面再经过initWithCoder方法把取出的值赋值给_name。相似地:变量
[encode encodeInt:_age forKey:@”age”];扩展
(2)initWithCoder:方法
取对象时该方法必须实现,每次从文件中恢复(解码)对象时,都会调用这个方法。通常在这个方法里面指定如何解码文件中的数据为对象的实例变量,能够使用decodeObjectForKey方法解码实例变量。即指定读取文件中哪一个东西变成属性。例如:im
-(id)initWithCoder:NSCoder *)decoder
{
if(self = [super init]){
_name = [decoder decodeObjectForKey:@”name”];
}
return self;
}
2、归档NSArray
归档一个NSArray对象到Documents/array.archive:
其中扩展名能够任意写,不写也能够。
NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
[NSKeyedArchiver archiveRootObject:array toFile:path];
归档成功将以下图:
3、恢复(解码)NSArray对象
4、归档对象的注意
若是父类也遵照了NSCoding协议,请注意:
(1)应该在encodeWithCoder:方法中加上一句
[super encodeWithCode:encode];
确保继承的实例变量也能被编码,即也能被归档
(2)应该在initWithCoder:方法中加上一句
self = [super initWithCoder:decoder];
确保继承的实例变量也能被解码,即也能被恢复