以前,我有一个数组,其中我使用NSKeyedArchiver来实现。
[NSKeyedArchiver archiveRootObject:array toFile:docPath];
致电applicationWillTerminate
和applicationDidEnterBackground
。
启动时,在didFinishLaunchingWithOPtions
中,数组未被删除:
NSMutableArray *array = [NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
一切都很好。从那时起,我为Settings变量添加了一个Singleton类。我也想归档单身人士。我该怎么做?
令我困惑的部分是我打电话给同一条消息:
[NSKeyedArchiver archiveRootObject:singleton toFile:docPath];
当我打电话时,应用程序如何知道我想要取消归档哪个对象:
[NSKeyedUnarchiver unarchiveObjectWithFile:docPath];
是阵列还是单身?
archiveRootObject接受一个(id),这意味着我想要的任何东西。我可以创建一个包含数组和单例的数据类。那是我怎么想这样做的?有没有更好的办法?欢迎任何建议。
谢谢!
答案 0 :(得分:3)
如果要在根级别编码多个对象,则需要自己使用+alloc
和-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对象;使用+alloc
和-initForReadingWithData:
创建一个NSKeyedUnarchiver;使用-decodeObjectForKey:
检索您关心的对象;最后拨打-finishDecoding
。您几乎可以从下到上阅读上面的示例,并进行一些名称更改。
答案 1 :(得分: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
了解有关存档的更多信息。