Runtime之NSCoding的自动归档、接档
2016-06-24 17:06
357 查看
有些初学者有可能在死记硬背Runtime的作用,为了应付面试,我在这就先简单介绍一下为什么要有Runtime的NSCoding的自动归档、接档(大牛可以略过)。
本地存储数据的时候大概有四种方式
1、NSUserDefaults
2、NSKeyedArchiver
3、SQLite
4、Write
在这1、3、4就不多说了,用NSKeyedArchiver归档存储数据的时候就需要遵循NSCoding协议了,要实现里面的归档、接档
现在看起来还可以吧,这是因为数据少的情况下,如果数据有几十条呢?写几十行这种代码,你感觉怎么样?只要错一个字节,你这个数据就是没有的。
这种情况就出现了今天要说的主题了:Runtime的自动归档、接档。
Runtime有一个方法可以获取当前类里面的属性列表,既然成员变量都能拿到,每一个成员变量所对应的key以及value当然也可以拿到,这样就不需要自己一行一行的去归档,接档了。
需要注意的一个细节就是当涉及到Runtime的时候。一定要记得内存的释放。Xcode的ARC只适用于OC,对于C的指针,要记得手动free。
本地存储数据的时候大概有四种方式
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。
相关文章推荐
- 机器学习流行算法一览
- Calculations are rather interesting
- python 文件查找 glob
- 正则表达式(RegExp Regular Expression)基础知识
- Unity UGUI基础之Button
- 分布式系统的数据结构
- Android开发中git命令使用
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
- Qt学习(二)------实例mynotepad制作
- java构造方法
- iOS开发屏幕自动旋转与调整大小
- DedeCMS访问网站首页会自动在域名后面多出index.html的解决方法
- ssh开发web.xml必须的配置
- Unity UGUI基础之Button
- 谷歌日志库GLog 使用说明
- 阅读推荐
- Android开机广播android.intent.action.BOOT_COMPLETED
- hdu4862Jump【最大费用最大流,判断是否满流】2014多校联合
- Elasticsearch安装配置
- CSS布局 ——从display,position, float属性谈起