利用runtime来实现一个动态归档的base类
实现步骤
- 动态获取成员变量
- 便利所有成员变量
- 动态获取成员变量名称作为key
- 利用KVC获取或者设置value
- 归档
- 释放
具体实现:
动态 归档:
//归档
//获取类属性个数
unsigned int count = 0;
//count 需要改变所以穿入&count c的常识
//ivars 类似数组 不会越界
Ivar *ivars = class_copyIvarList([self class], &count);
for (int i =0 ; i<count; i++) {
//获取属性名作为key
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
//获取value
id value = [self valueForKey:key];
//存入归档文件
[coder encodeObject:value forKey:key];
}
free(ivars);
动态解档
self = [super init];
if (self) {
//解档
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 stringWithUTF8String:name];
id value = [coder decodeObjectForKey:key];
[self setValue:value forKey:key];
}
free(ivars);
}
return self;
我将他封装成了一个base类只要继承可以非常简单的进行存取具体使用:
- 导入YHCodeBase文件
- 继承YHCodeBase@interface Text : YHCodeBase
- 初始化对象 Text *t = [[Text alloc]init];
- 赋值保存: t.name = @”1”; t.name2 = @”2”; t.name3 = @”3”; [t save:t WithFileName:@”11.11”];
- 读取 Text *t = [Text readfileName:@”11.11”]; NSLog(@”%@,%@,%@”,t.name3,t.name1,t.name);
具体demo请移步