将对象进行归档或者解档时,需要遵循NSCoding协议,对象必须实现encodeWithCoder方法和initWithcoder方法用于对象的编码和解码。遵循NSCoding的协议可以被序列化和反序列化
一、 在需要归档的类中遵循归档协议(NSCoding)
@interface Program : NSObject<NSCoding>
//需要归档的属性
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
二、在归档对象的.m方法中实现NSCoding的协议方法
//方法一:普通方式实现
- (void)encodeWithCoder:(NSCoder *)aCoder
{
//告诉系统归档的属性是哪些
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
//解档
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
//方法二:使用runtime方式实现
...之后补充
三、在Controller中实现具体的存取操作
- (IBAction)save:(UIButton *)sender {
Person *person = [[Person alloc] init];
person.name = @"Frank";
person.age = 18;
//这里以temp路径为例,存到temp路径下
NSString *temp = NSTemporaryDirectory();
NSString *filePath = [temp stringByAppendingPathComponent:@"obj.data"]; //注:保存文件的扩展名可以任意取,不影响。
NSLog(@"%@", filePath);
//归档
[NSKeyedArchiver archiveRootObject:person toFile:filePath];
}
- (IBAction)read:(UIButton *)sender {
//取出归档的文件再解档
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"obj.data"];
//解档
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"name = %@, age = %ld",person.name,person.age);
}
优点:可以创建自己想要的数据模型,然后统一以模型方式存储。比属性列表过分依赖key要省心
缺点:归档的形式保存数据,只能一次性归档保存和一次性解压,只能针对少量数据,并且对数据处理比较笨拙。即如果想要改动数据的一小部分,还需要解压整个数据或者归档整个数据,没有属性列表速度快(NSUserDefault)https://www.jianshu.com/p/d24dd98bc9dc
,因为他每次都要把数据保存到闪存中。