对象归档是一种序列化方式。为了便于数据传输,先将归档对象序列化为一个文件,然后再通过反归档将数据恢复到对象中。

归档技术可以实现数据的持久化,不过在大量数据和频繁读写的情况下,它就不太适合了。

对一个对象进行归档的条件是:改对象的类必须实现NSCoding协议,而且每个成员对象应该是基本数据类型或都是实现NSCoding协议的某个类的实例。

一、使用NSKeyedArchiver进行简单归档


1     NSString * path = NSHomeDirectory();
2     NSString * filePath = [path stringByAppendingPathComponent:@"sjz.txt"];
3     //归档,这里可以是NSString、NSDate、NSArray、NSDictionary等
4     [NSKeyedArchiver archiveRootObject:@"sjz" toFile:filePath];
5
6     //反归档
7     NSString * str = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

这种方式在写入、读出数据之前对数据惊醒序列化、反序列化操作,可以对基本类型数据进行归档。但是这样只能把一个对象归档进一个文件中。

二、多个数据的归档


当有多个数据的时候,我们就需要NSData的帮助了。

NSData封装了字典数据的缓存类,提供了数据文件的方法:

+ (instancetype)dataWithContentsOfFile:(NSString *)path

+ (instancetype)dataWithContentsOfFile:(NSString *)path  options:(NSDataReadingOptions)mask error:(NSError * _Nullable *)errorPtr

- (instancetype)initWithContentsOfFile:(NSString *)path

- (instancetype)initWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)mask error:(NSError * _Nullable *)errorPtr

上面四个方法用于从文件中读取数据创建NSData对象

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)atomically

- (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)mask error:(NSError * _Nullable *)errorPtr

这两个方法用于将NSData里的数据写的文件中去

 1 //文件路径
 2     NSString * path = NSHomeDirectory();
 3     NSString * filePath = [path stringByAppendingPathComponent:@"sjz.txt"];
 4
 5     NSString * str = @"小明";
 6     NSString * age = @"10";
 7     NSArray * arr = [NSArray arrayWithObjects:@"123", @"456", @"789", nil];
 8     NSInteger integer = 10;
 9
10     //归档
11     NSMutableData * data = [[NSMutableData alloc] init];
12     NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
13     [archiver encodeObject:str forKey:@"name"];
14     [archiver encodeObject:age forKey:@"age"];
15     [archiver encodeObject:arr forKey:@"arr"];
16     [archiver encodeInteger:integer forKey:@"integer"];
17     [archiver finishEncoding];
18     [data writeToFile:filePath atomically:YES];
19
20     //反归档
21     NSMutableData * unData = [[NSMutableData alloc] initWithContentsOfFile:filePath];
22     NSKeyedUnarchiver * unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unData];
23     NSString * name = [unArchiver decodeObjectForKey:@"name"];
24     NSString * ageStr = [unArchiver decodeObjectForKey:@"age"];
25     NSArray  * array = [unArchiver decodeObjectForKey:@"arr"];
26     NSInteger intt = [unArchiver decodeIntegerForKey:@"integer"];
27     [unArchiver finishDecoding];
28
29     NSLog(@"name = %@, age = %@", name, ageStr);
30     NSLog(@"%@", array);
31     NSLog(@"%ld", intt);

归档时,我们先将所需的数据归档到NSData中,再将NSData数据写到文件中。

反归档时,我们先从文件中读取数据到NSData中,再根据键值烦归档

第三、自定义对象的归档


上边说的是基本对象的归档,但是我们自己定义的实例对象怎么归档呢?

但我们按Home键将程序后台运行时,很多情况下我们要将数据保存,当程序恢复时,数据重新加载,那么归档是一个好的选择。

我们自定义的类想要实现归档与反归档,必须实现NSCoding协议,并实现协议中的两个方法:- (void)encodeWithCoder:(NSCoder *)aCoder 和 - (instancetype)initWithCoder:(NSCoder *)aDecoder

自定义类:

1 #import <Foundation/Foundation.h>
2
3 @interface JZModel : NSObject <NSCoding>
4
5 @property (nonatomic, strong) NSString * name;
6 @property (nonatomic, assign) NSInteger age;
7 @property (nonatomic, strong) NSString * address;
8
9 @end

 1 #import "JZModel.h"
 2
 3 @implementation JZModel
 4
 5 //必须实现,归档
 6 - (void)encodeWithCoder:(NSCoder *)aCoder
 7 {
 8     [aCoder encodeObject:_name forKey:@"name"];
 9     [aCoder encodeInteger:_age forKey:@"age"];
10     [aCoder encodeObject:_address forKey:@"address"];
11 }
12
13 //必须实现,反归档
14 - (instancetype)initWithCoder:(NSCoder *)aDecoder
15 {
16     self = [super init];
17     if(self){
18         _name = [aDecoder decodeObjectForKey:@"name"];
19         _age = [aDecoder decodeIntegerForKey:@"age"];
20         _address = [aDecoder decodeObjectForKey:@"address"];
21     }
22
23     return self;
24 }
25
26
27 - (NSString *)description
28 {
29     return [NSString stringWithFormat:@"姓名:%@,年龄:%ld,地址:%@", self.name, self.age, self.address];
30 }
31
32 @end

实现归档与反归档的代码:

 1 NSString * homePath = NSHomeDirectory();
 2     NSString * filePath = [homePath stringByAppendingPathComponent:@"sjz.plist"];
 3
 4     JZModel * model = [[JZModel alloc] init];
 5     model.name = @"jz";
 6     model.age = 20;
 7     model.address = @"河北大街";
 8
 9     //归档
10     NSMutableData * data = [[NSMutableData alloc] init];
11     NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
12     [archiver encodeObject:model forKey:@"model"];
13     [archiver finishEncoding];
14     [data writeToFile:filePath atomically:YES];
15
16
17     //反归档
18     NSMutableData * data1 = [[NSMutableData alloc] initWithContentsOfFile:filePath];
19     NSKeyedUnarchiver * unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data1];
20     JZModel * model1 = [unArchiver decodeObjectForKey:@"model"];
21     [unArchiver finishDecoding];
22
23     NSLog(@"%@", model1);

输出结果:

转载于:https://www.cnblogs.com/sjzlovecj/p/4837671.html

ios学习笔记——对象归档相关推荐

  1. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  2. iOS学习笔记-自定义过渡动画

    代码地址如下: http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swi ...

  3. iOS学习笔记22 推送通知

    ###一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. ######推送通知的常用应用场景: ...

  4. OpenCV for Ios 学习笔记(4)-标记检测1

    本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...

  5. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  6. iOS学习笔记-自己动手写RESideMenu

    代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...

  7. iOS学习笔记-地图MapKit入门

    代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...

  8. IOS学习笔记07---C语言函数-scanf函数

    2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072            ...

  9. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  10. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

最新文章

  1. android 图片缓存
  2. linux中怎么退出执行过程,(进程)处理过程中的Linux:从执行到退出
  3. 爱立信和威瑞森电信使用VR流式车来测试5G
  4. 企业级Python开发大佬利用网络爬虫技术实现自动发送天气预告邮件
  5. 不愿意和别人打交道_不想麻烦别人,也不希望别人麻烦我,是什么心理?看完就明白...
  6. fastjson jar包_经过性能对比,我发现温少的FastJson真牛。
  7. 20145202马超《信息安全系统设计基础》实验二总结
  8. 关于CAS服务器磁盘占用的问题,锁定目录惹的祸
  9. 阿里飞猪一员工涉案66亿,非法获利千万;美图将加密货币作为价值储备;Linus警告不要用Linux5.12-rc1 | 极客头条...
  10. NOIP模拟题——LGTB与序列
  11. 形式语义学-JLU-ZHH
  12. win mysql 命令行提示_数据分析进阶——mysql基本语句
  13. ar9285无线网卡驱动 linux,Qualcomm
  14. CREO:CREO软件的简介、安装(七大步骤)、学习路线大全(CREO软件各模块界面解释—菜单栏快速栏工作区、草绘/零件/工程图/装配设计讲解)、案例应用(几十个案例)之详细攻略
  15. 设计一款内容阅读app,要求与市面上的产品有差异化,列举其核心功能,画出页面设计原型图(2-3个),说明其产品价值
  16. java 合并mp3
  17. 牛客刷题——part2
  18. 【算法专题】数独问题详解
  19. LTE网络RLC层的polling机制
  20. java卸载(java卸载 windows installer)

热门文章

  1. VS2010+OpenCV2.4.9配置
  2. `ifdef、`else、`endif 用法
  3. mysql 查询的关键词的执行顺序
  4. delphi 简单的发送字符串消息
  5. poj 3984 迷宫问题(bfs)
  6. PHP底层的运行机制与原理
  7. android中的四种基本动画
  8. Docker 的部署方式
  9. 自动手动安装CDH5
  10. Linkedin Camus,从Kafka到HDFS的数据传输管道