使用archiveRootObject:toFile:方法能够将一个对象直接写入到一个文件里。但有时候可能想将多个对象写入到同一个文件里,那么就要使用NSData来进行归档对象。

NSData能够为一些数据提供暂时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容。

能够使用[NSMutableData data]创建可变数据空间。

相关的原理图(截图引用):

 //归档(编码)
// 新建一块可变数据区
NSMutableData *data = [NSMutableData data];
// 将数据区连接到一个NSKeyedArchiver对象
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 開始存档对象,存档的数据都会存储到NSMutableData中
[archiver encodeObject:person1 forKey:@"person1"];
[archiver encodeObject:person2 forKey:@"person2"];
// 存档完成(一定要调用这种方法)
[archiver finishEncoding];
// 将存档的数据写入文件
[data writeToFile:path atomically:YES]; //恢复(解码)
// 从文件里读取数据
NSData *data = [NSData dataWithContentsOfFile:path];
// 依据数据。解析成一个NSKeyedUnarchiver对象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
// 恢复完成
[unarchiver finishDecoding];

这样就实现了多个对象的归档。相同那些对应的person对象也是须要和前面所讲的那样进行归档的设置。

从上面所用的person类来进行深拷贝:

<span style="color:#000000;">- (void)viewDidLoad {
[super viewDidLoad]; Person* person1 = [[Person alloc]init]; // 暂时存储person1的数据
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];
// 解析data,生成一个新的Person对象
Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
// 分别打印内存地址
NSLog(@"person1:%p", person1);
NSLog(@"person2:%p", person2);
} 结果显示:
2015-08-19 15:42:46.797 ArchiveKey[2593:194031] person1:0x7fc021c33000
2015-08-19 15:42:46.798 ArchiveKey[2593:194031] person2:0x7fc021c2f140
能够看到两个地址不同样的。
</span>

最新文章

  1. OC与c混编实现Java的String的hashcode()函数
  2. ae 打开地图文档
  3. [Tools]迁移Confluence, JIRA, Fisheye
  4. include &quot;&quot;与include&lt;&gt;
  5. 【转发】查看Linux版本系统信息方法汇总
  6. hibernate和ibatis的区别
  7. Mac 修改用户名
  8. C语言字符串的常见特殊操作(除了string.c实现的那些接口)
  9. Spring Boot系列——AOP配自定义注解的最佳实践
  10. Serv-u 备份处理
  11. hbot固件配置
  12. Python:SQLMAP参数中文解释
  13. Mysql 之分库分表方案
  14. IPC&#39;s epoch 6 is less than the last promised epoch 7
  15. spring securiry Xml 配置 登陆
  16. Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game
  17. (转)MapReduce Design Patterns(chapter 4 (part 1))(七)
  18. Queries for Number of Palindromes (区间DP)
  19. 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
  20. ConcurrentHashMap 1.8为什么要使用CAS+Synchronized取代Segment+ReentrantLock

热门文章

  1. 原生js实现图片轮播思路分析
  2. 5分钟上手TypeScript
  3. css一些我所不熟练的属性
  4. Bower管理依赖库初体验
  5. python接口自动化21-规范的API接口文档示例
  6. [Java基础] java的守护线程与非守护线程
  7. dl,dt,dd标记在网页中要充分利用
  8. delphi Align属性
  9. Navicat查看MySQL日志
  10. mongodb多表查询(附带pymongo实例)