遵循NSCoding协议
NSCoding协议声明了两个方法,这两个方法是一定要实现的。其中一个方法用来说明如何将对象编码到归档中,另一个方法用来说明如何进行解档获取新对象。
1. 遵循协议和设置属性
@interface Student : NSObject<NSCoding>
/* 姓名 */
@property(nonatomic,copy)NSString *name;
/* 年龄 */
@property(nonatomic,assign)NSInteger age;
/* 身高 */
@property(nonatomic,assign)double height;
2. 实现协议方法一(归档,保存数据)
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeDouble:self.height forKey:@"height"];
}
3. 实现协议方法二(解档,读取数据)
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.height = [aDecoder decodeDoubleForKey:@"height"];
}
return self;
}
- 特别注意
如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。即 [super encodeWithCoder:aCoder] 和 [super initWithCoder:aDecoder] 方法;
使用
把对象归档是调用NSKeyedArchiver的工厂方法 archiveRootObject: toFile:
NSString *savePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"student.data"];
Student *student = [[Student alloc] init];
student.name = @"lily";
student.age = 25;
student.height = 166;
[NSKeyedArchiver archiveRootObject:student toFile:savePath];
从文件中解档对象就调用NSKeyedUnarchiver的一个工厂方法 unarchiveObjectWithFile:
NSString *readerPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"student.data"];
Student *student = [NSKeyedUnarchiver unarchiveObjectWithFile:readerPath];
if (student) {
self.informationLable.text = [NSString stringWithFormat:@"该学生的姓名:%@,年龄:%ld,身高:%.2f",student.name,student.age,student.height];
}
注意
必须遵循并实现NSCoding协议
保存文件的扩展名可以任意指定
继承时必须先调用父类的归档解档方法