19.2 使用NSKeyedArchiver归档

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

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

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

注意,iPhone SDK中没有提供NSArchiver。如果想在iPhone上使用归档功能,则必须使用NSKeyedArchiver。

要想使用带键的档案,需要导入


<Foundation/NSKeyedArchiver.h>.


代码清单19-3展示了如何使用NSKeyedArchiver类中的archiveRootObject:toFile:方法将glossary存储到磁盘上。要使用该类,在你的程序中包含以下文件


import<Foundation/NSKeyedArchiver.h>


代码清单19-3


import<Foundation/NSObject.h>

import<Foundation/NSString.h>

import<Foundation/NSDictionary.h>

import<Foundation/NSKeyedArchiver.h>

import<Foundation/NSAutoreleasePool.h>

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

NSDictionary*glossary=

[NSDictionary dictionaryWithObjectsAndKeys:

@“A class defined so other classes 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”];

[pool release];

return 0;

}


代码清单19-3并不在终端产生任何输出。但是,语句

[NSKeyedArchiver archiveRootObject:glossary toFile:@“glossary. archive”];

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

以后通过NSKeyedUnarchiver的unArchiveObjectWithFile:方法将创建的归档文件读入执行程序中,如代码清单19-4所示。

代码清单19-4


import<Foundation/NSObject.h>

import<Foundation/NSString.h>

import<Foundation/NSDictionary.h>

import<Foundation/NSEnumerator.h>

import<Foundation/NSKeyedArchiver.h>

import<Foundation/NSAutoreleasePool.h>

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

NSDictionary*glossary;

glossary=[NSKeyedUnarchiver unarchiveObjectWithFile:

@“glossary.archive”];

for(NSString*key in glossary)

NSLog(@“@:%@”,key,[glossary objectForKey:key]);

[pool drain];

return 0;

}


代码清单19-4输出


abstract class:A class defined so other classes can inherit from it.

adopt:To implement all the methods defined in a protocol

archiving:Storing an object for later use.


语句


glossary=[NSKeyedUnarchiver unarchiveObjectWithFile:@“glossary.archive”];


将指定的文件打开并读取文件的内容。该文件必须是前面归档操作的结果。可以为文件指定完整路径名或相对路径名,如本例所示。

在恢复glossary之后,程序可以简单地通过枚举其内容来验证恢复是否成功。