iOS开发之数据存储之NSKeyedArchiver

1、概述编码

NSKeyedArchiver归档和plist文件存储不一样的是NSKeyedArchiver能够直接保存对象。若是对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,能够直接用NSKeyedArchiver进行归档和恢复。不是全部的对象均可以直接用这种方法进行归档,只有遵照了NSCoding协议的对象才能够被存储。code

NSCoding协议中的2个方法:对象

1encodeWithCoder:继承

存对象时该方法必须实现,每次归档对象时,都会调用这个方法。通常在这个方法里面指定如何归档对象中的每一个实例变量,能够使用encodeObject:forKey:方法归档实例变量。即指定存储哪些属性和在文件中以什么名字做为key存储这些属性。例如:it

[encode  encodeObject:_name  forKey:@”name”];io

系统下次从文件中取_name的值就自动用name这个key去取,后面再经过initWithCoder方法把取出的值赋值给_name。相似地:变量

[encode  encodeInt:_age  forKey:@”age”];扩展

2initWithCoder:方法

取对象时该方法必须实现,每次从文件中恢复(解码)对象时,都会调用这个方法。通常在这个方法里面指定如何解码文件中的数据为对象的实例变量,能够使用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];

确保继承的实例变量也能被解码,即也能被恢复

相关文章
相关标签/搜索