NSKeyedArchiver 是什么?
简单地讲,NSKeyedArchiver 就是用来存储对象数据到本地,即归档。
好搭档是 NSKeyedUnarchiver,负责从本地存储还原对象数据,即反归档。
同时需要配合 NSCoding 使用,实现序列化以及反序列化。
简单例子
UserModel 实现 NSCoding(Delegate),即:
@interface UserModel : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
@implementation UserModel
#pragma mark - NSCoding
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
@end
NSKeyedArchiver / NSKeyedUnarchiver 使用示例:
// 会把 model 的数据存储到 path 这个路径的文件里
[NSKeyedArchiver archiveRootObject:userModel toFile:path];
// 从文件中直接取出,并生成相应对象
UserModel *model = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
关于存储后的文件
存储的文件本质是一个 plist 文件,无论文件名是否带有 .plist
后缀,直接打开都是数字。
但使用工具可以查看里面内容,也可以通过写代码读取其中数据。
而在安全性方面,如果我们在设定 Key 时,不跟属性名一样,而是使用随机字符。
这样可以降低文件的可读性,一定程度上也算一种加密。
与其他存储方式的区别
Core Data 和 SQLite 比较适合需要对大量数据进行查询,插入操作的场景。
UserDefaults 默认把数据都存储在同个 plist 文件中。
而 NSKeyedArchiver 可以存储在不同路径,比较自由,同时也支持序列化以及反序列化,在处理 Model 层时,比较方便。
开发时,各取所需。
关于嵌套使用
假设 UserModel 有个 CatModel 的对象,那么存储时,是否可以将 CatModel 存储到文件中呢?
其实,只要 CatModel 实现了<NSCoding>,也是可以的。
像 NSArray
, NSDictionary
都已经实现了 <NSCoding> 的子协议 <NSSecureCoding>,可以直接使用。比如,存储多个 Model 到文件中。