- 19.2 使用NSKeyedArchiver归档
- import<Foundation/NSKeyedArchiver.h>
- import<Foundation/NSObject.h>
- import<Foundation/NSString.h>
- import<Foundation/NSDictionary.h>
- import<Foundation/NSKeyedArchiver.h>
- import<Foundation/NSAutoreleasePool.h>
- import<Foundation/NSObject.h>
- import<Foundation/NSString.h>
- import<Foundation/NSDictionary.h>
- import<Foundation/NSEnumerator.h>
- import<Foundation/NSKeyedArchiver.h>
- import<Foundation/NSAutoreleasePool.h>
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之后,程序可以简单地通过枚举其内容来验证恢复是否成功。