2

说我有这个:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[@1] = @2;
dict[@3] = dict;

dict我通过调用归档:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dict];

然后我稍后取消存档:

NSMutableDictionary *dict2 = [NSKeyedUnarchiver unarchiveObjectWithData:data]

问题是dict2[@3]不是dict2,而是未初始化NSDictionary的,我无法恢复我放入的内容。有谁知道我将如何解决这个问题?提前致谢!

4

2 回答 2

4

Apple 工程师在 Apple 邮件列表中对此进行了解释: http : //lists.apple.com/archives/cocoa-dev/2007/May/msg00747.htmlNSMutableArray元素。

概括:

这(很可能 - 我没有研究过)不是递归本身的问题,而是在取消归档期间通过从initWithCoder:.
...
所以总结答案是:你不能可靠地拥有递归引用。但是,在实践中,这些确实会发生(想想NSView 子视图/父视图的关系)并且事情会吱吱作响。有时他们不这样做,而且不可能事先知道某事是否可行。

Chris Kane
可可框架,Apple

于 2013-07-29T07:21:12.677 回答
1

如果这行得通,我会感到非常惊讶。当你设置 dict[@3]=dict 时,你基本上是给它一个无限循环来创建一个无限深的字典。当您从字典创建数据时,它似乎可以通过用未初始化的字典替换无限字典来保护您,这样在应用程序崩溃之前用户的内存不会完全耗尽。

如果您要尝试在控制台中打印出 dict[@3],则应用程序将无限循环尝试将其打印出来并且会卡住,直到它最终在稍后的某个时间崩溃。

因此,如果您想将字典存储在字典中,请创建另一个字典。

于 2013-07-29T07:17:31.360 回答