您的位置:首页 > 其它

Runtime之NSCoding的自动归档、接档

2016-06-24 17:06 357 查看
有些初学者有可能在死记硬背Runtime的作用,为了应付面试,我在这就先简单介绍一下为什么要有Runtime的NSCoding的自动归档、接档(大牛可以略过)。

本地存储数据的时候大概有四种方式

1、NSUserDefaults 

2、NSKeyedArchiver

3、SQLite

4、Write 

在这1、3、4就不多说了,用NSKeyedArchiver归档存储数据的时候就需要遵循NSCoding协议了,要实现里面的归档、接档

//归档方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
//当学生被归档,学生要将成员都归档
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}

//解归档方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
//当学生被解归档,学生要将成员都解归档
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}


现在看起来还可以吧,这是因为数据少的情况下,如果数据有几十条呢?写几十行这种代码,你感觉怎么样?只要错一个字节,你这个数据就是没有的。

这种情况就出现了今天要说的主题了:Runtime的自动归档、接档。

Runtime有一个方法可以获取当前类里面的属性列表,既然成员变量都能拿到,每一个成员变量所对应的key以及value当然也可以拿到,这样就不需要自己一行一行的去归档,接档了。

#import "person.h"
#import <objc/runtime.h>
@implementation person

// 接档读数据
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
/*
OBJC_EXPORT Ivar *class_copyIvarList(Class cls, unsigned int *outCount)

Class cls 表示获取那一个类的属性列表
unsigned int *outCount 用于存储获取到属性个数
*/
unsigned int count = 0;

Ivar *ivar = class_copyIvarList([self class], &count);

for (int i = 0; i < count; i++) {
//根据每一个属性取出对应的key 注意key值是c语言的key
Ivar iva = ivar[i];

const char *key = ivar_getName(iva);
// 转换为oc
NSString *strName = [NSString stringWithUTF8String:key];
//进行解档取值
id value = [aDecoder decodeObjectForKey:strName];
//利用KVC对属性赋值
[self setValue:value forKey:strName];
}

free(ivar);
}
return self;
}
// 归档存数据
- (void)encodeWithCoder:(NSCoder *)aCoder {

unsigned int count;

Ivar *ivar = class_copyIvarList([self class], &count);

for (int i=0; i < count; i++) {

Ivar iv = ivar[i];

const char *name = ivar_getName(iv);

NSString *strName = [NSString stringWithUTF8String:name];

//利用KVC取值
id value = [self valueForKey:strName];

[aCoder encodeObject:value forKey:strName];

}

free(ivar);
}

需要注意的一个细节就是当涉及到Runtime的时候。一定要记得内存的释放。Xcode的ARC只适用于OC,对于C的指针,要记得手动free。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: