将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(keyed)的档案来完成。

Mac OS X从版本10.2开始支持带键的档案。在此之前,要使用NSArchiver类创建连续的(sequential)归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。

在带键的归档中,每个归档字段都有一个名称。归档某个对象时,会为它提供一个名称,即键。从归档中检索该对象时,是根据这个键来检索的。这样可以按照任意的顺序将对象写入归档并进行检索。另外,如果向类添加了新的实例变量或删除了实例变量,程序也可以进行处理。

注意:默认情况下,只能对NSDate, NSNumber, NSString, NSArray, or NSDictionary来进行归档。

如果要归档我们自定义的对象,在part2会讲解
part1
#import <Foundation/Foundation.h>int main(int argc, const char * argv[])
{@autoreleasepool {//---------------使用NSKeyedArchiver归档(存储各种类型的对象数据)-------------//将字典数据写到文件glossary.archive中NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:@"A class defined so other class can inherit from it.",@"abstract class",@"To implement all the methods defined in a protocol.",@"adopt",@"Storing an object for later use.",@"archiving",nil];[NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];//将文件glossary.archive中的数据读到字典对象并显示出来NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];for(NSString *key in readglossary)NSLog(@"%@: %@",key,[readglossary objectForKey:key]);}return 0;
}

其中,

    [NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];

将字典glossary写入到文件glossary.archive中。可以为该文件指定任何路径名。在本例中,文件被写入当前目录下。

之后,又通过

    NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];

方法将创建的归档文件读入执行程序中。这个语句将指定的文件打开并读取文件的内容,该文件必须是以前归档操作的结果。可以为文件指定完整路径名或相对路径名。

在显示结果之后,可以简单的通过枚举其内容来验证恢复是否成功。

原文http://blog.csdn.net/enuola/article/details/7802371

part2

但是,当我们对自己定义的对象进行“编码/解码”操作时,却需要实现NSCoding协议的相关方法来告诉程序如何来“编码/解码”我们自己的对象!
NSCoding协议的方法:

- (void)encodeWithCoder:(NSCoder *)aCoder;

- (id)initWithCoder:(NSCoder *)aDecoder;

那么,我们就对类实现“编码/解码”协议:
在AddressCard.h中,申明实现NSCoding协议:

@interface AddressCard : NSObject<NSCopying,NSCoding>

在AddressCard.m中,实现NSCoding协议的编码/解码 方法:

#pragma mark- NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder{

[aCoder encodeObject:self.name forKey:@"AddressCard_name"];

[aCoder encodeObject:self.email forKey:@"AddressCard_email"];

[aCoder encodeInt32:self.salary forKey:@"AddressCard_salary"];

}

- (id)initWithCoder:(NSCoder *)aDecoder{

_name=[[aDecoder decodeObjectForKey:@"AddressCard_name"] retain];

_email=[[aDecoder decodeObjectForKey:@"AddressCard_email"] retain];

_salary=[aDecoder decodeInt32ForKey:@"AddressCard_salary"];

return self;

}

这样,我们就能够归档自己定义的类对象。

NSString *filePhyName=[filePath stringByAppendingPathComponent:@"ObjectFile"];

BOOL isSuccess=NO;

isSuccess= [NSKeyedArchiver archiveRootObject:objArray toFile:filePhyName];

if (isSuccess) {

NSLog(@"Success");

}else{

NSLog(@"False");

}

// 反归档

NSMutableArray *myObj=[NSKeyedUnarchiver unarchiveObjectWithFile:filePhyName];

for (AddressCard *theCard in myObj) {

[theCard print];

}

从输出可以看到,归档成功!
归档需要注意的是:
1.同一个对象属性,编码/解码的key要相同!
2.每一种基本数据类型,都有一个相应的编码/解码方法。
如:encodeObject方法与decodeObjectForKey方法,是成对出现的。
3.如果一个自定义的类A,作为另一个自定义类B的一个属性存在;那么,如果要对B进行归档,那么,B要实现NSCoding协议。并且,A也要实现NSCoding协议。

转载于:https://www.cnblogs.com/xiaobaizhu/p/4011332.html

使用NSKeyedArchiver归档相关推荐

  1. 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver

    在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...

  2. ObjC学习11-复制对象与归档

    感觉这两个概念有点朦胧,为了学习路线的完整性,这里浅浅地学习下,不懂的以后实践再去想懂~ 1.复制对象 Foundation类实现了名为copy和mutableCopy的方法 可以用这些方法来创建对象 ...

  3. iOS学习笔记15 序列化、偏好设置和归档

    ###一.本地持久化 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist ...

  4. 【转】iOS开发学习计划

    转自:简书 一.C语言基础 基本数据类型.基本运算.函数.数组.字符串.指针.结构体.预处理指令.枚举.文件操作.内存管理 二.Objective-C 1.Objective-C基本语法 数据类型.表 ...

  5. iOS中几种数据持久化方案总结

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

  6. 【iOS数据持久化】Plist使用

    iOS数据持久化Plist使用 iOS 端数据持久化就是把数据保存在本地,常用于基本信息储存,应用配置,应用支持数据源,网络请求缓存等.主要有如下几种方式: 方式 介绍 特点 Plist文件 属性列表 ...

  7. iOS数据存储简要笔记

    1.  数据存储常用的方式(1)XML 属性列表(plist)归档 (2)preference(偏好设置) (3)NSKeyedArchiver归档(NSCoding) (4)  SQLite3   ...

  8. iOS应用数据持久化(一)

    一.iOS应用常用的数据持久化方式: 1.XML属性列表(plist) 2.preference(偏好设置) 3.NSKeyedArchiver(归档与反归档) 4.SQLite3(数据库) 5.Co ...

  9. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

最新文章

  1. js判断是iOS还是Android
  2. 逻辑 STANDBY ORA-00368日志应用失败处理一例
  3. 《Ajax实战》三部曲之“王者归来”
  4. Spring MVC 单元调试和访问
  5. DX使用随记--ImageComboBoxEdit
  6. 虚拟化笔记05 OpenFiler configuration
  7. PHP对URL进行字符串编码
  8. java单行字符_十个便捷的单行代码编程技巧
  9. 在python中下列代码的运行结果是print abc_python与数学
  10. Android开发之自定义菊花进度条对话框
  11. 完美者右键扩展菜单管理器 1.2.1 中文绿色版
  12. android8修改默认壁纸,给surfaceview设置默认背景
  13. SIFT算法问题issue1
  14. mysql sql语句面试经典50题_经典sql面试及答案(50)
  15. hadoop三大组件
  16. 基于Java实现一个简单的单词本Android App
  17. 如何使用ArcGIS制作真实的植被
  18. LinuxShell作业题-1
  19. Linux系统安全加固指南(万字长文)
  20. windows脚本创建桌面快捷图标方式

热门文章

  1. cas 注销不关闭浏览器异常_如何关闭华为手机这些“流氓”推送?
  2. cnn池化层输入通道数_(pytorch-深度学习系列)CNN中的池化层-学习笔记
  3. 异步fifo_FPGA设计基础——FIFO的应用
  4. php内存映射,如何用ZwMapViewOfSection将Driver分配的内存映射到App空间?
  5. matlab求固有频率,eig()函数求固有频率和有限元软件求固有频率结果不相等
  6. android studio真机模拟不能拍照_android和ios静态库的生成
  7. jtoken判断是否包含键_Redis列表键(linkedlist/ziplist)的介绍
  8. c语言用fun求矩阵,C语言通过函数调用求n*n阶矩阵周边元素绝对值之和
  9. Python 中三大框架各自的应用场景
  10. eclipse下java.lang.OutOfMemoryError: PermGen space解决方法