数据本地持久化时, 一般会将模型进行归档, 从本地获取数据时, 需要解档
下面使用runtime的方式进行归档解档, 复制粘贴即可, 就算后期添加和删减属性, 也不需要对这里做任何操作
第一步, 模型遵守协议 <NSCoding>
第二部, 导入runtime头文件 #import <objc/runtime.h>
第三步, 将下面代码复制粘贴到需要本地化的模型.m文件中即可
- (void)encodeWithCoder:(NSCoder *)encoder
{
unsigned int count = 0;
// 利用runtime获取实例变量的列表
Ivar *ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i ++) {
// 取出i位置对应的实例变量
Ivar ivar = ivars[i];
// 查看实例变量的名字
const char *name = ivar_getName(ivar);
// C语言字符串转化为NSString
NSString *nameStr = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
// 利用KVC取出属性对应的值
id value = [self valueForKey:nameStr];
// 归档
[encoder encodeObject:value forKey:nameStr];
}
// 记住C语言中copy出来的要进行释放
free(ivars);
}
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super init]) {
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([self class], &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
//
NSString *key = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
id value = [decoder decodeObjectForKey:key];
// 设置到成员变量身上
if (!value) continue;
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
}