【问题标题】:Is NSDictionary's objectForKey look up reference or value based?NSDictionary 的 objectForKey 是查找引用还是基于值?
【发布时间】:2009-10-19 13:00:03
【问题描述】:

我有一个 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");
}

我应该使用其他操作来测试字典中是否存在特定键吗?

【问题讨论】:

  • 我认为您的数据类型是 id 而不是 id *。请记住,id 大致相当于void*,但更具动态性并且不需要任何转换来存储它。 (事实上​​,你有一个指向 id 的指针,在这种情况下它仍然有效,但在语义上是错误的。)
  • 投票关闭不再相关,因为作者似乎发现了错误。

标签: objective-c


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多