1

以前,我有一个使用 NSKeyedArchiver 归档的数组。

[NSKeyedArchiver archiveRootObject:array toFile:docPath];

调用applicationWillTerminateapplicationDidEnterBackground

启动时,在 中didFinishLaunchingWithOPtions,数组未归档:

NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];

一切都很好。从那时起,我为 Settings 变量添加了一个 Singleton 类。我也想归档单例。我该怎么做?

让我困惑的部分是如果我调用相同的消息:

[NSKeyedArchiver archiveRootObject:singleton toFile:docPath];

当我调用时,应用程序如何知道我要取消归档的对象:

[NSKeyedUnarchiver unarchiveObjectWithFile:docPath];

是数组还是单例?

archiveRootObject 接受一个(id),这对我来说意味着我想要的任何东西。我可以创建一个包含数组和单例的数据类。这就是我应该这样做的吗?有没有更好的办法?欢迎任何建议。

谢谢!

4

2 回答 2

3

如果要在根级别对多个对象进行编码,则需要使用+allocand-initForWritingWithMutableData:自己创建存档器,向它发送 -encodeObject:forKey: 消息,用于您要添加到存档中的每个对象,最后发送-finishEncoding. 然后,您可以自己将数据写入文件。

它看起来像这样(警告:未测试代码):

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

[archiver encodeObject:someObject forKey:@"people"];
[archiver encodeObject:anotherObject forKey:@"places"];
[archiver encodeObject:thirdObject forKey:@"things"];
[archiver finishEncoding];

[data writeToURL:someUrl atomically:YES];
[archiver release];

要检索对象,您将做相反的事情:将文件读入 NSData 对象;创建一个 NSKeyedUnarchiver+alloc-initForReadingWithData:; 检索您关心使用的对象-decodeObjectForKey:;最后打电话-finishDecoding。您几乎可以从下到上阅读上面的示例,只需更改一些名称。

于 2011-06-29T03:59:11.213 回答
3

要存档,您的单例类必须符合NSCoding协议。您将不得不实现它的initWithCoder:encodeWithCoder:方法。

同样,如果您archiveRootObject:toFile:对具有相同文件路径的两个对象进行操作,那么您将覆盖其中一个。要对两个对象进行编码,您必须执行以下操作,

NSData * data = [NSMutableData data];
NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:array forKey:@"Array"];
[archiver encodeObject:singleton forKey:@"Singleton"];
[archiver finishEncoding];
BOOL result = [data writeToFile:filePath atomically:YES];
[archiver release];

您可以在此阅读更多关于归档的信息guide

于 2011-06-29T04:00:08.120 回答