iOS开发 - 数据归档与恢复 NSKeyedArchiver
归档与恢复归档
归档,英文Archiver[‘ɑrkɪvə],这里指的是将OC的对象存储为一个文件或者网络上的一个数据块。
恢复归档。英文UnArchiver,指的是将一个来自文件或网络的归档数据块恢复成内存中的一个OC对象。
归档和恢复主要用于对自己定义类型对象进行存储。在程序暂停或关闭前保存自己定义数据。在程序又一次恢复状态或启动后读取存储的自己定义数据。
支持归档和恢复的类必须实现NSCoding协议,再由NSKeyedArchiver和NSKeyedUnarchiver类进行转换。将对象转换为数据流
其他语言,如java/.net 将此技术称为序列化。
归档集合类型
IOS 非常多内置类型都默认实现了归档功能。如NSNumber,NSArray,NSDictionary,NSString,NSData等。
定义NSArray或NSDicitionary类型,初始化数据后。调用NSKeyedArchiver 类的archiveRootObject 传入file路径,就可以将当前NSArray对象完善的保存到文件系统中。
读取归档数据,使用NSKeydUnarchiver类unarchiveObjectWithFile方法能够直接从文件读回数据,并返回NSArray对象
NSKeyedArchiver和NSKeyedUnarchiver类都是将对象属性和值以key|value的方式顺序存储和读取的。
非常多时候我们须要归档和恢复自己定义对象,因此须要让自己定义对象实现归档功能
实现归档仅仅须要遵循(实现)NSCoding协议或是NSCoding的子协议。
NSKeyedArchiver
假设对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,能够直接用NSKeyedArchiver进行归档和恢复
不是全部的对象都能够直接用这样的方法进行归档,仅仅有遵守了NSCoding协议的对象才干够
NSCoding协议有2个方法:
encodeWithCoder:
每次归档对象时,都会调用这种方法。
一般在这种方法里面指定怎样归档对象中的每一个实例变量,能够使用encodeObject:forKey:方法归档实例变量
initWithCoder:
每次从文件里恢复(解码)对象时,都会调用这种方法。
一般在这种方法里面指定怎样解码文件里的数据为对象的实例变量,能够使用decodeObject:forKey方法解码实例变量
有时须要将多个对象归档到一个文件,此时我们须要使用NSMutableData作为缓冲存储对象。
先将对象归档到NSData中。再将NSData写入到文件里。
NSKeyedArchiver-归档NSArray
归档一个NSArray对象到Documents/array.archive
NSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];
[NSKeyedArchiver archiveRootObject:array toFile:path];
恢复(解码)NSArray对象
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:path]
NSKeyedArchiver-归档Person对象(Person.h)
@interface Person : NSObject<NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) float height;
@end
NSKeyedArchiver-归档Person对象(Person.m)
@implementation Person
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeInt:self.age forKey:@"age"];
[encoder encodeFloat:self.height forKey:@"height"];
}
- (id)initWithCoder:(NSCoder *)decoder {
self.name = [decoder decodeObjectForKey:@"name"];
self.age = [decoder decodeIntForKey:@"age"];
self.height = [decoder decodeFloatForKey:@"height"];
return self;
}
- (void)dealloc {
[super dealloc];
[_name release];
}
@end
NSKeyedArchiver-归档Person对象(编码和解码)
//归档(编码)
Person *person = [[[Person alloc] init] autorelease];
person.name = @"wangzhaolu";
person.age = 26;
person.height = 1.78f;
[NSKeyedArchiver archiveRootObject:person toFile:path];
//恢复(解码)
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSKeyedArchiver-归档对象的注意
假设父类也遵守了NSCoding协议,请注意:
应该在encodeWithCoder:方法中加上一句
[super encodeWithCode:encode];
确保继承的实例变量也能被编码,即也能被归档
应该在initWithCoder:方法中加上一句
self = [super initWithCoder:decoder];
确保继承的实例变量也能被解码。即也能被恢复
NSData
使用archiveRootObject:toFile:方法能够将一个对象直接写入到一个文件里,但有时候可能想将多个对象写入到同一个文件里,那么就要使用NSData来进行归档对象
NSData能够为一些数据提供暂时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容。
能够使用[NSMutableData data]创建可变数据空间
NSData-归档2个Person对象到同一文件里
//归档(编码)
// 新建一块可变数据区
NSMutableData *data = [NSMutableData data];
// 将数据区连接到一个NSKeyedArchiver对象
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
// 開始存档对象,存档的数据都会存储到NSMutableData中
[archiver encodeObject:person1 forKey:@"person1"];
[archiver encodeObject:person2 forKey:@"person2"];
// 存档完成(一定要调用这种方法)
[archiver finishEncoding];
// 将存档的数据写入文件
[data writeToFile:path atomically:YES];
NSData-从同一文件里恢复2个Person对象
恢复(解码)
// 从文件里读取数据
NSData *data = [NSData dataWithContentsOfFile:path];
// 依据数据,解析成一个NSKeyedUnarchiver对象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
// 恢复完成
[unarchiver finishDecoding];
归档的封装
#import <Foundation/Foundation.h>
@interface NSObject (Addition)
+(BOOL)keyedArchiver:(id)obj key:(NSString *)key;
+(BOOL)keyedArchiver:(id)obj key:(NSString *)key path:(NSString *)path;
+(id)keyedUnarchiver:(NSString *)key;
+(id)keyedUnarchiver:(NSString *)key path:(NSString *)path;
@end
#define DefaultKeyedArchiverPath [NSString stringWithFormat:@"%@/Documents/DefaultKeyedArchiver.data", NSHomeDirectory()]
@implementation NSObject (Addition)
/**
* 归档
*
* @param obj 须要归档的类
* @param key 归档key
*
* @return YES表示成功,NO表示失败
*/
+(BOOL)keyedArchiver:(id)obj key:(NSString *)key
{
return [self keyedArchiver:obj key:key path:DefaultKeyedArchiverPath];
}
/**
* 归档
*
* @param obj 须要归档的类
* @param key 归档key
* @param path 归档路劲
*
* @return YES表示归档成功,NO表示归档失败
*/
+(BOOL)keyedArchiver:(id)obj key:(NSString *)key path:(NSString *)path
{
NSMutableData *tpData = [NSMutableData data];
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:tpData];
[keyedArchiver encodeObject:obj forKey:key];
[keyedArchiver finishEncoding];
return [tpData writeToFile:path atomically:YES];
}
/**
* 解档
*
* @param key key
*
* @return 解析的结果
*/
+(id)keyedUnarchiver:(NSString *)key
{
return [self keyedUnarchiver:key path:DefaultKeyedArchiverPath];
}
/**
* 解档
*
* @param key 解挡key
* @param path 解挡路径
*
* @return 解析的结果
*/
+(id)keyedUnarchiver:(NSString *)key path:(NSString *)path
{
NSMutableData *tpData = [NSMutableData dataWithContentsOfFile:path];
NSKeyedUnarchiver *keyedUnarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:tpData];
return [keyedUnarchiver decodeObjectForKey:key];
}
@end
iOS开发 - 数据归档与恢复 NSKeyedArchiver的更多相关文章
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...
- IOS开发--数据持久化篇文件存储(二)
前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...
- IOS开发--数据持久化篇之文件存储(一)
前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...
- iOS开发 数据缓存-数据库
iOS中数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding (NSKeyedArchiver\NSk ...
- iOS开发——数据持久化Swift篇&模型对象归档
模型对象归档 import UIKit class ViewController: UIViewController { @IBOutlet weak var textField: UITextFie ...
- iOS开发-数据持久化
iOS中四种最常用的将数据持久存储在iOS文件系统的机制 前三种机制的相同点都是需要找到沙盒里面的Documents的目录路径,附加自己相应的文件名字符串来生成需要的完整路径,再往里面创建.读取.写入 ...
- iOS开发-数据存储NSCoder
软件中永远绕不开的一个问题就是数据存储的问题,PC的时候一般都是选择在数据库中存储,iOS如果是和后端配合的话,那么不需要考虑数据存储的这个问题,上次写了一下plist的存储,不过数据都是存储一些简单 ...
- iOS开发——数据持久化Swift篇&(一)NSUserDefault
NSUserDefault //******************** 5.1 NSUserDefault和对象归档 func useNSUserDefault() { //通过单利来创建一个NSU ...
- iOS开发——数据持久化Swift篇&文件目录路径获取(Home目录,文档目录,缓存目录等)
文件目录路径获取(Home目录,文档目录,缓存目录等) iOS应用程序只能在自己的目录下进行文件的操作,不可以访问其他的存储空间,此区域被称为沙盒.下面介绍常用的程序文件夹目录: 1,Home ...
随机推荐
- Python内置数据结构之字符串str
1. 数据结构回顾 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于字符串,但是字符串是不可变序列,因此所有的元素赋值和切片赋值都是非法的. >>> ...
- 算法38---292. Nim游戏
1.题目: 你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函 ...
- NodeJS学习笔记 (2)文件系统操作-fs(ok)
原文:https://github.com/chyingp/nodejs-learning-guide/blob/master/%E6%A8%A1%E5%9D%97/fs.md#%E9%80%9A%E ...
- vue中的methods、computed和watch
1.computed属性: 经过处理返回的数据值,只要源数据没有发生改变,computed函数里面对相应的数据就不会反生改变,相当于缓存在本地;发生改变的时候,computed对应数据的函数才会发生改 ...
- 【BZOJ 1269】 [AHOI2006]文本编辑器editor
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] /* [move k] 指令.直接 把pos改成k.表示改变光标位置 [insert n s],在pos后面插入一个长度为n的字符串 ...
- 养活一款APP要“烧”多少钱?
Duang!又一款APP刷爆朋友圈.大片范儿的电影截图.意味深长的经典对白均出自一款名为“足记”的APP. 足记团队刚于去年8月完成天使期融资,投资方是光速创投和紫辉创投,目前正准备A轮融资.且近一周 ...
- iOS RegexKitLite 提取匹配的内容
使用RegexKitLite正则表达式需要以下工作: 1.RegexKitLite官方网址(内含使用教程):http://regexkit.sourceforge.net/RegexK ...
- 芒果TV真实视频地址解析
本文旨在互相学习,请勿滥用 若有幸被您引用请附加地址来源http://blog.csdn.net/feige2008/article/details/37579051 文章主要解析芒果TV的视频真实地 ...
- nyoj--311--完全背包(动态规划,完全背包)
完全背包 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 直接说题意,完全背包定义有N种物品和一个容量为V的背包,每种物品都有无限件可用.第i种物品的体积是c,价值是w. ...
- MinGW - 安装和配置 / MinGW - Howto Install And Configure
MinGW在线安装程序下载地址:http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get- ...