长话短说,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不必要。
答案 0 :(得分:2)
我无法使用NSString
作为键并使用NSNumber
作为值来复制问题。我怀疑您的自定义类未正确实现hash
和/或isEqual
。具体来说,这两个方法的结果必须一致,这意味着如果isEqual
返回true,则两个对象的hash
值必须相同。
您还需要确保您的班级正确实施NSCopying
并且副本与原始版本相同。
答案 1 :(得分:1)
作为一般规则,不要将自定义对象用于字典键。只需使用字符串即可完成。
正如user3386109指出的那样,自定义对象必须正确实现-hash
和-isEqual
方法才能用作字典键,即使这样,自定义对象也无法正常运行字典用于键/值编码的键。