1、相关知识点:
<1> 可以利用NSKeyedArchiver 进行归档和恢复的对象类型:NSString 、NSDictionary、NSArray、NSData、 NSNumber等
<2> 使用是必须遵循NSCoding协议对象,实现两个方法:
encodeWithCoder:归档对象时,将会调用该方法。
initWithCoder:每次从文件中恢复对象时,调用该方法。
2、简单例子阐述详细步骤
<1> 创建一个学生对像HUStudent,遵循 NSCoding 协议,并给学生对像规定三个属性:
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) double height;
@property (nonatomic, assign) int age;
<2> 利用第一个方法进行数据的存储:需要说明需要存储的属性
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeInt:self.age forKey:@"age"];
[encoder encodeDouble:self.height forKey:@"height"];
}
<3> 利用第二个方法解析对象:读取对象属性
- (id)initWithCoder:(NSCoder *)decoder
{
if(self = [super init])
{
self.name = [decoder decoderObjectForKey:@"name"];
self.age = [decoder decoderObjctForKey:@"age"];
self.height = [decoder decoderObjectForKey:@"height"];
}
return self;
}
<4> 在控制器中对模型对象进行赋值与读取
>>模型对象的属性赋值
//----1.新的模型对象
HUStudent * student = [[HUStudent alloc]init];
student.name = @"hulin";
student.age = 24;
student.height = 1.83;
// -----2.归档模型对象
NSString * doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject]; // 获得Documents全路径
NSString * path = [doc stringByAppendingPathComponent:@"student.plist"]; // 获取文件的全路径
NSArray * array = @[student];
[NSKeyedArchiver archiveRootObject:array toFile:path]; // 将对象归档
//----- 3.读取模型对象的属性
NSString * doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]; // 获得 Documents全路径
NSString * path = [doc stringByAppendingPathComponent:@"student.plist"]; // 获得文件的全路进
HUStudent * student = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; // 从文件中读取对象
NSLog(@"%@,%d,%f",student.name,student.age,student.height);
3、使用NSKeyedArchiver存储数据注意事项:
如果程序中创建的子类和父类都遵循了NSCoding协议,要在encodeWithCoder:方法中加上[self encodeWithCode:encode](确保继承的实例变量也能被 编码);同样在 initWithCoder:加上 self = [super initWithCoder:decoder](确保实例变量也能被解码);