当我们需要将一个对象进行归档时,都要让该对象的类遵守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 = ;
Ivar *ivars = class_copyIvarList(c, &count);
for (int i = ; 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 = ; Ivar *ivars = class_copyIvarList(c, &count); for (int i = ; 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 = ;
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); }

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

最新文章

  1. mysqlbinlog抽取某个表的信息
  2. AngularJS 依赖注入
  3. Linux下MongoDB服务安装
  4. I.MX6 initramfs.cpio.gz.uboot unpack
  5. Verilog经典输入控制/激励信号模板1
  6. Css常用收集
  7. silverlight Canvas、StackPanel、Grid三者之间的关系
  8. iOS 中关于ViewController总结
  9. toast 防止一直不停弹出,累积显示
  10. 第十六章:网络IPC:套接字
  11. 从3D Studio Max导入物体 Importing Objects From 3D Studio Max
  12. kafka java客户端编程
  13. JTA事务管理--配置剖析
  14. U3d 手游优化概述
  15. ios 上拉载入下拉刷新Dome
  16. jQuery遍历-同胞
  17. 在Spring Boot中使用swagger-bootstrap-ui
  18. math对象与数组对象
  19. Linux文件的扩展名--2019-04-25
  20. 20175234 2018-2019-2 《Java程序设计》第九周学习总结

热门文章

  1. smtpclient 邮件发送测试
  2. 细数JDK里的设计模式&lt;转&gt;
  3. Eclipse 中 Debug 模式跳转到 exitCurrentThread 的问题解决
  4. KMP算法匹配原理以及C++实现
  5. POJ 1523 SPF 割点与桥的推断算法-Tarjan
  6. 轻松使用jquery解析XML
  7. Qt Creater中Clang-format的使用
  8. linux 打包 解压 tar zip tgz
  9. 嵌入式驱动开发之usb 无线网卡驱动---RT2870STA dm368
  10. ffmpeg 源码分析