ios学习笔记——对象归档
对象归档是一种序列化方式。为了便于数据传输,先将归档对象序列化为一个文件,然后再通过反归档将数据恢复到对象中。
归档技术可以实现数据的持久化,不过在大量数据和频繁读写的情况下,它就不太适合了。
对一个对象进行归档的条件是:改对象的类必须实现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学习笔记——对象归档相关推荐
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- iOS学习笔记-自定义过渡动画
代码地址如下: http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swi ...
- iOS学习笔记22 推送通知
###一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. ######推送通知的常用应用场景: ...
- OpenCV for Ios 学习笔记(4)-标记检测1
本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...
- IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...
IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...
- iOS学习笔记-自己动手写RESideMenu
代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...
- iOS学习笔记-地图MapKit入门
代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...
- IOS学习笔记07---C语言函数-scanf函数
2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072 ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
最新文章
- android 图片缓存
- linux中怎么退出执行过程,(进程)处理过程中的Linux:从执行到退出
- 爱立信和威瑞森电信使用VR流式车来测试5G
- 企业级Python开发大佬利用网络爬虫技术实现自动发送天气预告邮件
- 不愿意和别人打交道_不想麻烦别人,也不希望别人麻烦我,是什么心理?看完就明白...
- fastjson jar包_经过性能对比,我发现温少的FastJson真牛。
- 20145202马超《信息安全系统设计基础》实验二总结
- 关于CAS服务器磁盘占用的问题,锁定目录惹的祸
- 阿里飞猪一员工涉案66亿,非法获利千万;美图将加密货币作为价值储备;Linus警告不要用Linux5.12-rc1 | 极客头条...
- NOIP模拟题——LGTB与序列
- 形式语义学-JLU-ZHH
- win mysql 命令行提示_数据分析进阶——mysql基本语句
- ar9285无线网卡驱动 linux,Qualcomm
- CREO:CREO软件的简介、安装(七大步骤)、学习路线大全(CREO软件各模块界面解释—菜单栏快速栏工作区、草绘/零件/工程图/装配设计讲解)、案例应用(几十个案例)之详细攻略
- 设计一款内容阅读app,要求与市面上的产品有差异化,列举其核心功能,画出页面设计原型图(2-3个),说明其产品价值
- java 合并mp3
- 牛客刷题——part2
- 【算法专题】数独问题详解
- LTE网络RLC层的polling机制
- java卸载(java卸载 windows installer)