自引用NSMutableDictionary

时间:2013-07-29 06:39:57

标签: ios objective-c nsmutabledictionary nskeyedarchiver nskeyedunarchiver

说我有这个:

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,而我无法恢复我放入的内容。有谁知道我会如何工作在这附近?提前谢谢!

2 个答案:

答案 0 :(得分:4)

Apple邮件列表上的Apple工程师对此进行了解释:http://lists.apple.com/archives/cocoa-dev/2007/May/msg00747.html, 回复有关归档NSMutableArray的类似问题 将自己作为一个元素。

要点:

  

这(很可能 - 我没有调查过)不是问题   本身的递归,而是替换自己的对象   在取消归档期间,从initWithCoder:返回一个新对象   ...
  所以总结的答案是:你不能可靠地递归   引用。但实际上,这些确实发生了(想想NSView   subview / superview关系)和事情吱吱作响。有时他们   不要而且事先不知道某件事是否会奏效   不

     

Chris Kane
  Cocoa Frameworks,Apple

答案 1 :(得分:1)

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

如果您尝试在控制台中打印出dict [@ 3],应用程序将无限循环尝试将其打印出来并且会被卡住,直到它最后崩溃为止。

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