我有一个大而复杂的对象图。我已经实现了 NSCoding 来归档和取消归档对象图。通常,一切正常。但是在某些高度可重现的情况下,我归档的 NSMutableDictionary 会被取消归档为 NSPlaceholderDictionary。这是 NSMutableDictionary 的私有子类,表示未初始化的字典。它不响应任何常用的 NSDictionary 方法。
我想知道是否有人遇到过类似的问题。如果是这样,你能解决它吗?如何?
编辑:关于这种情况,我可以说的一件事是字典本身嵌套很深,包含很多字典和数组。在它的深处是一个指向另一个正在创建的对象的指针。对象图是一棵树。树中的大多数对象都包含对其父对象的弱引用。问题发生在树的 n 层深处。在崩溃时,堆栈看起来像这样 [我已经简化了它]:
0. crash because dictionary is a placeholder
1. depth n initWithCoder -- decode a deep and large dictionary which, prior to encoding contained reference to object at depth n+4. Said object has not yet been decoded.
2. Apple methods
3. depth n+1 initWithCoder -- decode reference to parent
4. 38 frames of apple methods for very deeply nested dictionary
5. depth n-1 initWithCoder -- decode a deeply nested dictionary. Among other things, the dictionary contains a reference to the level n+1 object [inside a lot of nested dictionaries and arrays]
6. Apple methods
7. depth n-2 object initWithCoder -- decode reference to array containing its children