NSKeyedArchiver|NSKeyedArchiver 使用

NSKeyedArchiver 是什么? 简单地讲,NSKeyedArchiver 就是用来存储对象数据到本地,即归档。
好搭档是 NSKeyedUnarchiver,负责从本地存储还原对象数据,即反归档。
同时需要配合 NSCoding 使用,实现序列化以及反序列化。
简单例子 UserModel 实现 NSCoding(Delegate),即:

@interface UserModel : NSObject @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 实现了,也是可以的。
NSArray, NSDictionary 都已经实现了 的子协议 ,可以直接使用。比如,存储多个 Model 到文件中。
参考 【NSKeyedArchiver|NSKeyedArchiver 使用】NSCoding / NSKeyedArchiver-NShipster

    推荐阅读