对于iOS开发中的归档,最近刚好在项目中使用到了归档,所以查了查资料,查缺补漏,现总结如下:
什么时候使用归档?
归档是为了存储一些自定义对象,本质上是文件的存储。它不同于plist属性存储,plist可以存储集合类型(NSArray,NSMutableArray,NSString..),但是不可以存储对象,归档存储的是NSData类型数据。只要对象支持NSCoding协议,就可以被归档。还有一点是对象归档的文件是保密的,磁盘上无法查看文件中的内容,而属性列表是明文的可以查看
存储的位置?
这里涉及到ios中的沙盒机制。什么是沙盒机制呢?
<pre>
沙盒机制是ios为了数据安全特别适用的一种安全体系。iOS应用程序只能访问自己的目录
应用程序与应用程序之间禁止数据共享和访问。特定的应用,比如联系人,需要特定的API
才可以共享数据。当应用安装之后,会在手机里面开辟一个沙箱目录,这个目录之中有三个
子目录,分别是Document,Library,tmp。
Document:用于存储比较大的需要频繁更新数据;
Library:基于NSUserDefaults的首选项设置存储在 Library/Preferences
文件夹中,且Library下面有Preferences和Caches目录;
tmp:用于存储临时文件
归档使用是Document目录,获得该目录的方法是:
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
其中:第一个常量NSDocumentDirectory表示正在查找沙盒Document目录的路径
(如果参数为NSCachesDirectory则表示沙盒Cache目录),第二个常量
NSUserDomainMask表明我们希望将搜索限制在应用的沙盒内;
(在Mac OS X中,此常量表示我们希望该函数查看用户的主目录,因此才会有这个命名;)
</pre>
如何使用归档来存储自定义对象?
使用归档,最重要的就是归档自定义模型类。首先申明模型对象的属性:
在开发过程中,每一个需要归档的类都需要实现NSCoding的方法,都要实现编码、解码的重复性动作,如果该对象属性很多的情况下,我们的效率就变的很低了,我们可以使用MJExtension来简化这个过程,这是一套字典和模型之间互相转换的超轻量级框架,里面也有归档的接口。只需要一句话,就可以解决问题.
MJExtensionCodingImplementation或者MJCodingImplementation