NSDictionary的objectForKey是基于查找引用还是值?

时间:2009-09-23 21:35:18

标签: objective-c

我有一个NSMutableDictionary实例,我使用的键是NSNumber *类型。

在我的场景中,我正在尝试使用'objectForKey'来检索我知道存在的字典中的对象。但是除非我将密钥从NSNumber转换为NSString,否则我的结果会一直为零。

NSNumber *itemId = [NSNumber numberWithInt:5];

id *existingItem = [forRemovalLookup objectForKey:itemId];
if (existingItem == nil)
{
  // expected: shouldn't be nil
  NSLog(@"!!!!!Not expecting this to be nil");
}

我是否应该使用另一个操作来测试字典中是否存在特定的键?

1 个答案:

答案 0 :(得分:1)

工作,但前提是[itemID hash]等于密钥的哈希,并且[itemID isEqual:]在与相关密钥进行比较时返回true。我认为NSNumber的哈希就是它所拥有的数字,但是字符串的哈希值完全不同,即使它只是一个相同数字的字符串表示。从内存中,字符串的哈希值是通过将每个字符值乘以累加器的值乘以一定量来计算的。

可能还有其他一些我缺少的东西,但是在Cocoa邮件列表上讨论了关于集合对象内部的类行为,并且普遍的共识是,如果一个类要在集合中保持良好,它应该正确返回-hash-isEqual:的值。

我知道这个答案在这种情况下并没有真正帮助你,但它可能会对字典集合在Cocoa中的工作方式有所了解。