当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法。例如有一个Person类,该类有两个成员变量

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;

两个协议的实现方法如下

/***  将对象写入某个文件时需要调用,在该方法中说明哪些属性需要存储*/
- (void)encodeWithCoder:(NSCoder *)encoder
{[encoder encodeObject:self.name forKey:@"name"];[encoder encodeInt:self.age forKey:@"age"];
}/***  从文件中解析对象时会调用,在该方法中解析对象的属性*/
- (id)initWithCoder:(NSCoder *)decoder
{if (self = [super init]) {// 解析之后要赋值给属性_name = [decoder decodeObjectForKey:@"name"];_age = [decoder decodeIntForKey:@"age"];}return self;
}

但当该类拥有上百个属性时,那将会花费更多的功夫在重复代码上,所以使用运行时机制截取类的成员变量,进行赋值

例如有一个狗类Dog和它的父类动物类Animal

狗类的成员变量有

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;

动物类的成员变量有

@property (nonatomic,assign) double weight;

当我们需要将狗对象进行归档时,可以在类中这样重写归档和解档方法

- (id)initWithCoder:(NSCoder *)aDecoder
{if (self = [super init]) {Class c = self.class;// 截取类和父类的成员变量while (c && c != [NSObject class]) {unsigned int count = 0;Ivar *ivars = class_copyIvarList(c, &count);for (int i = 0; i < count; i++) {NSString *key = [NSString stringWithUTF8String:ivar_getName(ivars[i])];id value = [aDecoder decodeObjectForKey:key];[self setValue:value forKey:key];}// 获得c的父类c = [c superclass];free(ivar);}}return self;
}- (void)encodeWithCoder:(NSCoder *)aCoder
{Class c = self.class;// 截取类和父类的成员变量while (c && c != [NSObject class]) {unsigned int count = 0;Ivar *ivars = class_copyIvarList(c, &count);for (int i = 0; i < count; i++) {Ivar ivar = ivars[i];NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];id value = [self valueForKey:key];[aCoder encodeObject:value forKey:key];}c = [c superclass];// 释放内存
        free(ivar);}}

代码测试:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{CXDog *d = [[CXDogalloc] init];d.name = @"cx";d.age = 12;d.weight = 1.55;// 将对象归档[NSKeyedArchiverarchiveRootObject:d toFile:@"/Users/c_xie/Desktop/wj.xxoo"];// 将对象解档CXDog *dog = [NSKeyedUnarchiverunarchiveObjectWithFile:@"/Users/c_xie/Desktop/wj.xxoo"];NSLog(@"%@,%d,%f",dog.name,dog.age,d.weight);}

以后就算有再多的属性,一个循环搞定

转载于:https://www.cnblogs.com/junhuawang/p/5798827.html

Runtime应用(三)实现NSCoding的自动归档和自动解档相关推荐

  1. iOS - iOS 12 之后的归档(NSKeyedArchiver)、解档(NSKeyedUnarchiver)用法

    一.iOS 12 之后旧的归档解档方法废弃了,更改为: 归档: + (nullable NSData *)archivedDataWithRootObject:(id)object requiring ...

  2. 关于(archive)归档和(unarchive)解档的处理。

    在面向对象的编程中,会涉及到对象的保存,对象的保存在JAVA当中称之为serialize,也叫序列化.而在cocoa当中,这个过程称之为归档.cocoa当中最最典型的序列化例子就是NIB文件的保存和读 ...

  3. runtime自动归档/解档

    原文出自:标哥的技术博客 前言 善用runtime,可以解决自动归档解档.想想以前归档是手动写的,确实太麻烦了.现在有了runtime,我们可以做到自动化了.本篇文章旨在学习如何通过runtime实现 ...

  4. CUDA运行时Runtime(三)

    CUDA运行时Runtime(三) 一.异步并发执行 CUDA将以下操作公开为可以彼此并发操作的独立任务: 主机计算: 设备计算: 从主机到设备的内存传输: 从设备到主机的存储器传输: 在给定设备的存 ...

  5. mysql 自动归档,如何将数据库从非归档模式转为自动归档模式:

    这个问题小哥哥问过我,我一下卡住了,答不上来,他骂我,学了那么久,这么简单的东西你都不会?我低头默默无语!我确实没有反抗的权利,只能在被骂完之后赶紧学去!这个就是我的命,我的学习永远跟不上他们的步骤, ...

  6. Objective-C Runtime (三):Method Swizzling(方法替换)

    Objective-C Runtime (三):Method Swizzling(方法替换) Method Swizzling是一种改变改变一个'selector'的实际实现的技术.通过这一技术,我们 ...

  7. mysql历史数据自动归档

    数据库跑一段时间后,因为查询性能.磁盘容量,运维管理等方面的原因,需要将在线数据挪到历史库(不同的服务器).如我们的在线订单只留3个月数据,3个月以前的就需要到历史库查了. 自动归档常见的方式有pt- ...

  8. 剪叉式升降机构三维图 三菱水平多关节型机器人RH-6SDH5520 半自动钻孔机STP 给料机SW 全自动压力测试机SW 三色3D打印机STP 转盘式自动铆钉机STP 装卡环轴承扇叶机sw

    剪叉式升降机构三维图 三菱水平多关节型机器人RH-6SDH5520 半自动钻孔机STP 给料机SW 全自动压力测试机SW 三色3D打印机STP 转盘式自动铆钉机STP 装卡环轴承扇叶机sw 电脑自动剥 ...

  9. GoldenGate自动归档discard文件

    1.背景 GoldenGate重要的日志文件有2个:ggserr.log和discard文件. ggserr.log记录重要的日志,如进程启停.进程失败abend及响应ggsci命令的响应输出. di ...

最新文章

  1. Datawhale组队学习周报(第003周)
  2. python中类方法与实例方法的区别-Python实例方法、静态方法和类方法详解(包含区别和用法)...
  3. 文本超出多行显示省略号 移动端禁止双击缩放
  4. Java读取HttpServletRequest的post数据流
  5. java ee jstl_Java EE之JSTL(下)
  6. 准备写一本协议方面的书,谁赞成,谁反对?
  7. 用Maven创建第一个web项目Struts2项目
  8. 一种求解线性方程组的技巧
  9. Android软键盘与EditText近乎完美的交互
  10. PHP 类似time控件功能,最新火车头免费伪原创插件,多功能秒杀市面上所有同类工具...
  11. 恶意代码检测理论(静态与动态分析基础)
  12. 用图层蒙版抠图并合成(每天一个PS小项目)
  13. 【Python】1.基本语法元素
  14. 英伟达(NVIDIA)系列显卡(GPU)技术指标对比排行
  15. 计算机组成与原理第三章答,计算机组成与原理第三章答案.doc
  16. java获取文件名格式 / java获取文件名后缀
  17. 移动智能终端之应用商店和应用的安全管理机制(笔记四)
  18. GitHub 中超过3.5万开源代码被投毒
  19. 购物网站HTML(首页)
  20. oracle 中递归查询的使用

热门文章

  1. codeforces 940D 比赛总结
  2. windows 注册表讲解
  3. python3—廖雪峰之练习(三)
  4. 从请求管道深入剖析HttpModule的实现机制,有图有真相
  5. sql 存储过程学习
  6. bat脚本登陆ftp服务器
  7. redirect和forward的区别
  8. 关于hql一些不常见但好用的技巧(个人总结)
  9. Visual C++ 2012编译器更新(预览版)发布
  10. 冒号课堂§2.4:并发范式