Runtime应用(三)实现NSCoding的自动归档和自动解档
当我们需要将一个对象进行归档时,都要让该对象的类遵守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的自动归档和自动解档相关推荐
- iOS - iOS 12 之后的归档(NSKeyedArchiver)、解档(NSKeyedUnarchiver)用法
一.iOS 12 之后旧的归档解档方法废弃了,更改为: 归档: + (nullable NSData *)archivedDataWithRootObject:(id)object requiring ...
- 关于(archive)归档和(unarchive)解档的处理。
在面向对象的编程中,会涉及到对象的保存,对象的保存在JAVA当中称之为serialize,也叫序列化.而在cocoa当中,这个过程称之为归档.cocoa当中最最典型的序列化例子就是NIB文件的保存和读 ...
- runtime自动归档/解档
原文出自:标哥的技术博客 前言 善用runtime,可以解决自动归档解档.想想以前归档是手动写的,确实太麻烦了.现在有了runtime,我们可以做到自动化了.本篇文章旨在学习如何通过runtime实现 ...
- CUDA运行时Runtime(三)
CUDA运行时Runtime(三) 一.异步并发执行 CUDA将以下操作公开为可以彼此并发操作的独立任务: 主机计算: 设备计算: 从主机到设备的内存传输: 从设备到主机的存储器传输: 在给定设备的存 ...
- mysql 自动归档,如何将数据库从非归档模式转为自动归档模式:
这个问题小哥哥问过我,我一下卡住了,答不上来,他骂我,学了那么久,这么简单的东西你都不会?我低头默默无语!我确实没有反抗的权利,只能在被骂完之后赶紧学去!这个就是我的命,我的学习永远跟不上他们的步骤, ...
- Objective-C Runtime (三):Method Swizzling(方法替换)
Objective-C Runtime (三):Method Swizzling(方法替换) Method Swizzling是一种改变改变一个'selector'的实际实现的技术.通过这一技术,我们 ...
- mysql历史数据自动归档
数据库跑一段时间后,因为查询性能.磁盘容量,运维管理等方面的原因,需要将在线数据挪到历史库(不同的服务器).如我们的在线订单只留3个月数据,3个月以前的就需要到历史库查了. 自动归档常见的方式有pt- ...
- 剪叉式升降机构三维图 三菱水平多关节型机器人RH-6SDH5520 半自动钻孔机STP 给料机SW 全自动压力测试机SW 三色3D打印机STP 转盘式自动铆钉机STP 装卡环轴承扇叶机sw
剪叉式升降机构三维图 三菱水平多关节型机器人RH-6SDH5520 半自动钻孔机STP 给料机SW 全自动压力测试机SW 三色3D打印机STP 转盘式自动铆钉机STP 装卡环轴承扇叶机sw 电脑自动剥 ...
- GoldenGate自动归档discard文件
1.背景 GoldenGate重要的日志文件有2个:ggserr.log和discard文件. ggserr.log记录重要的日志,如进程启停.进程失败abend及响应ggsci命令的响应输出. di ...
最新文章
- Datawhale组队学习周报(第003周)
- python中类方法与实例方法的区别-Python实例方法、静态方法和类方法详解(包含区别和用法)...
- 文本超出多行显示省略号 移动端禁止双击缩放
- Java读取HttpServletRequest的post数据流
- java ee jstl_Java EE之JSTL(下)
- 准备写一本协议方面的书,谁赞成,谁反对?
- 用Maven创建第一个web项目Struts2项目
- 一种求解线性方程组的技巧
- Android软键盘与EditText近乎完美的交互
- PHP 类似time控件功能,最新火车头免费伪原创插件,多功能秒杀市面上所有同类工具...
- 恶意代码检测理论(静态与动态分析基础)
- 用图层蒙版抠图并合成(每天一个PS小项目)
- 【Python】1.基本语法元素
- 英伟达(NVIDIA)系列显卡(GPU)技术指标对比排行
- 计算机组成与原理第三章答,计算机组成与原理第三章答案.doc
- java获取文件名格式 / java获取文件名后缀
- 移动智能终端之应用商店和应用的安全管理机制(笔记四)
- GitHub 中超过3.5万开源代码被投毒
- 购物网站HTML(首页)
- oracle 中递归查询的使用