Runtime之NSCoding的自动归档、接档
为什么要有Runtime的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"
@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 charchar *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 charchar *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。
另外补充一下class_copyPropertyList和class_copyIvarList的区别:
class_copyPropertyList返回的仅仅是对象类的属性(@property申明的属性),而class_copyIvarList返回类的所有属性和变量(包括在@interface大括号中声明的变量),下面做个简单的测试。首先,定义一个WFrequencyManager类,然后在测试类中写一个测试函数testProperties调用上述两个函数得到其返回结果再分别依次遍历输出其返回值

执行上述测试函数后在控制台输出结果为:
从上述执行结果可以很好的说明前者只获取由@property声明的属性,而后者不但获取了@property属性,而且还获取了@interface大括号中声明的变量
Runtime之NSCoding的自动归档、接档的更多相关文章
- Runtime应用(三)实现NSCoding的自动归档和自动解档
当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法.例如有一个Person类,该类有两个成员变量 @property (nonatomic,copy) NS ...
- runtime之归档和解档
IOS开发之NSCoding协议(使用runtime)近期学习IOS的runtime库,然后看到之前写的NSCoding协议有点复杂,如果属性少还好,如果100多个属性,则会显得麻烦.下面使用常规方式 ...
- 利用Runtime对Ivar实例变量进行共用的归档和解档方式
一.介绍 在OC中每一个对象持有的变量都是实例变量,实例变量包括成员变量和属性变量,在runtime中用Ivar表示对象的实例变量.其实,runtime源码中可以看到,Ivar也是一个结构体(基本上在 ...
- 自动归档autoArchive By H.l
写点简单的代码,让开发更简单 详情:ios 应用实现快速的临时缓存之模型的自动归档 Demo:https://files.cnblogs.com/files/sixindev/AutoArchiver ...
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
- IOS数据存储之归档/解档
前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...
- iOS开发中的4种数据持久化方式【一、属性列表与归档解档】
iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...
- 【IOS学习基础】归档和解档
一.归档介绍 1.归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程.归档是将数据持久化的一种方式(所谓数据持久化,就是指在IOS开发过程中,将数据保存到本地,能够让程序的运行更加流畅 ...
- iOS基础知识之归档和解档
归档和解档:即将数据写入文件和从文件中读取数据. 此处以plist文件为例说明, 一.plist文件使用时的注意事项: 1.plist文件中仅支持写入Array,Dictionary,Boolean, ...
随机推荐
- UTC 通用格式时间 转换为 时间戳,并格式化为2017-01-01 12:00:00
在使用阿里云oss获取文件列表是,发现时间格式是这样的 2016-09-20T13:45:04.000Z (尼玛,是什么鬼), 经过度娘的解答,发现这就是传说中的 UTC通用格式时间 问题来了,怎么转 ...
- Xamarin调用JSON.net来解析JSON
https://www.cnblogs.com/zjoch/p/4458516.html 再来我们要怎么解析JSON格示呢?在.net 中,我们很孰悉的JSON.net,没错,我们依然可以在X ...
- npm安装删除模块以及cnpm淘宝镜像
npm安装模块 [$ npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录: [$ npm install -g xxx]利用npm安装全局模块xxx: npm 删除模块 ...
- 设计模式(三)装饰者模式Decorator
装饰者模式针对的问题是:对一个结构已经确定的类,在不改变该类的结构的情况下,动态增加一些功能. 一般来说,都是对一些已经写好的架构增加自己的功能,或者应对多种情况,增加功能. 我们还是来玩一句红警,首 ...
- c/c++ console(控制台)编程详解
前言: 控制台文本窗口的控制是基于win32 api(win32 api可理解为微软给我们提供的一系列函数的集合)实现的; 例1: #include <stdio.h>int main() ...
- windows 异常处理
为了程序的健壮性,windows 中提供了异常处理机制,称为结构化异常,异常一般分为硬件异常和软件异常,硬件异常一般是指在执行机器指令时发生的异常,比如试图向一个拥有只读保护的页面写入内容,或者是硬件 ...
- win10 uwp 横向 AppBarButton
一般看到的 AppBarButton 都是图片在上面,文字在下面,是否可以更改让文字在和图片相同的位置?本文告诉大家如何做出横向的 AppBarButton 把图标和文本放在一起. 如果需要添加 Ap ...
- Erlang gen_server进程花样作死
本文主要记录各种情况下gen_server进程退出的表现. 研究动机起源于Elixir/Phoenix框架中遇到的一个进程异常退出问题.因为网络异常,客户端超过一段时间未发来消息,channel进程( ...
- MySQL索引 - 索引的类型
索引的类型 B-Tree索引 B-Tree 索引 通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同. B-Tree 索引 能够加快访问数据的速度,存储引擎不再需要进行全表扫描来获取需 ...
- 个人项目--“”小鱼企业级开发系统“”Svn地址分享
由于精力有限,博主现在只维护这一个系统,会不时的更新代码提交. ""小鱼企业级开发系统""的Svn地址:http://code.taobao.org/svn/S ...