NSMutableDictionary内容与allValues的输出不一致

时间:2014-05-12 23:21:58

标签: ios objective-c core-data nsmutabledictionary

长话短说,NSMutableDictionary内容的输出与同一对象上调用allValues的结果之间存在差异。下面是检查演示我的问题的对象后的一些调试器输出:(当然是通用的)

(lldb) po self.someDict.allKeys
<__NSArrayI 0xa5a2e00>(
    <SomeObject: 0xa5a2dc0>,
    <SomeObject: 0xa5a2de0>
)

(lldb) po self.someDict.allValues
<__NSArrayI 0xa895ca0>(
    0.5,
    0.5
)

(lldb) po self.someDict
{
    "<SomeObject: 0xa5a2dc0>" = (null);
    "<SomeObject: 0xa5a2de0>" = (null);
}

正如我们所看到的,NSMutableDictionary的实际输出包含其两个条目的空值,但.allValues的内容包含正确的数据。这三项产出是在执行的同时进行的。

我不确定为什么会发生这种情况,但我认为这可能与我编码/解码该字典是使用CoreData属性的对象这一事实有关。我相信我做得很好:

[aCoder encodeObject:self.someDict forKey:@"someDict"];

并解码

self.someDict = [aDecoder decodeObjectForKey:@"someDict"];

奇怪的是,如果我在编码之前检查字典,它仍然处于帖子开头所描述的状态,所以这就是为什么我怀疑CoreData动作是在搞砸内容。

与往常一样,请不要犹豫,要求提供更多信息。

编辑:问题如下所示。我使用的是一个不与isEqual合作的自定义类,所以我的解决方案是更改逻辑的存储和结构,这使得使用Dictionary不必要。

2 个答案:

答案 0 :(得分:2)

我无法使用NSString作为键并使用NSNumber作为值来复制问题。我怀疑您的自定义类未正确实现hash和/或isEqual。具体来说,这两个方法的结果必须一致,这意味着如果isEqual返回true,则两个对象的hash值必须相同。

您还需要确保您的班级正确实施NSCopying并且副本与原始版本相同。

答案 1 :(得分:1)

作为一般规则,不要将自定义对象用于字典键。只需使用字符串即可完成。

正如user3386109指出的那样,自定义对象必须正确实现-hash-isEqual方法才能用作字典键,即使这样,自定义对象也无法正常运行字典用于键/值编码的键。