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 到文件中。

参考

NSCoding / NSKeyedArchiver-NShipster

你可能感兴趣的:(NSKeyedArchiver 使用)