有 一种更加灵活的方法 可以使 你 将 任何类型的物件 存储 在物件当中,不仅仅 是 字符串、数组 和 辞典。这种方法 就是 利用 NSKeyedArchiver这类物件 创建 有关键字的归档。
自从10.2版后 Mac OS X 开始支持 有关键字的归档。在10.2版之前 人们 利用 NSArchiver这类物件 创建 有顺序的归档。有顺序的归档 要求 什么顺序 写入 就要 什么顺序 读出。
有关键字的归档 就是 归档中的每个条目 都有 一个名称。当你 将 一个物件 归档时,你 就给 它 一个名字 或者 叫 关键字。当你 要将 物件 从归档中 读取出来时,你 就透过 关键字 将 其 读取出来。透过这样的方式 物件 可以用 任何顺序 写入、读出。而且 如果 某类物件的构成 发生 改变,比如 每个这类物件 增加了 或者 减少了 变量,程序 也会考虑在内的。
iPhone 并不支持 NSArchiver这类物件。所以 在iPhone上 必须使用 NSKeyedArchiver这类物件 进行归档。要使用 NSKeyedArchiver这类文件,需要 在程序中 导入 <Foundation/NSKeyedArchiver.h>这个文件。
下面这个程序 示范了 如何将 glossary这个辞典物件 写入 文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #import <Foundation/NSObject.h> #import <Foundation/NSString.h> #import <Foundation/NSDictionary.h> #import <Foundation/NSKeyedArchiver.h> #import <Foundation/NSAutoreleasePool.h> int main (int argc, const char * argv[]) { NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; NSDictionary *glossary=[NSDictionary dictionaryWithObjectsAndKeys: @"抽象的物件类型中可以包含具体的物件类型", @"抽象的物件类型", @"实施协议中规定的所有措施", @"遵循", @"将物件存储起来备用", @"归档", nil]; [NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"]; [pool release]; return 0; } |
在这个程序当中 我 向NSKeyedArchiver这类物件 发送了 archiveRootObject:toFile:这条消息,从而 将 物件glossary 写入 文件glossary.archive。
同时 我们 可以向 NSKeyedUnarchiver这类物件 发送 unarchiveObjectWithFile:这条消息 将 文件中的物件 读取出来,就像 下面这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSKeyedArchiver.h>
#import <Foundation/NSAutoreleasePool.h>
intmain(intargc,constchar*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
NSDictionary*glossary;
glossary=[NSKeyedUnarchiverunarchiveObjectWithFile:@"glossary.archive"];
for(NSString*keyinglossary)
{
NSLog(@"%@:%@",key,[glossaryobjectForKey:key]);
}
[pooldrain];
return0;
}
|
运行 这个程序后,可以得到 这样的结果:
|
2012-06-08 15:20:11.473 Sample[1347:707] 遵循:实施协议中规定的所有措施
2012-06-08 15:20:11.477 Sample[1347:707] 抽象的物件类型:抽象的物件类型中可以包含具体的物件类型
2012-06-08 15:20:11.478 Sample[1347:707] 归档:将物件存储起来备用
|
从第二个程序的运行结果 可以看出 第一个程序 成功地 将 物件glossary 写入了 文件glossary.archive。