NSDictionary的objectForKey:依赖于身份还是平等?

时间:2012-09-13 09:47:27

标签: objective-c cocoa-touch cocoa foundation

假设我有一个名为Person的对象,其属性为socialSecurityNumber,当社会安全号码属性相等时,此类会覆盖isEqual:方法以返回true。并说我已将Person的一堆实例放入NSDictionary

如果我现在实例化一个newPerson对象,该对象恰好具有与字典中已有的相同的社会安全号码,并且[myDictionary objectForKey:newPerson],它是否会使用isEqual:并返回是,还是比较指针并返回NO?

我知道我可以编写一个简单的测试来查找,但我想了解objectForKey:在字典中找到匹配的确切程度,以及这与Cocoa的一致性(即NSArray 'indexofObject:的工作方式相同?)

2 个答案:

答案 0 :(得分:10)

NSDictionary就像哈希表一样。因此,它使用-hash-isEqual:来查找字典中与给定键对应的对象。

所以要回答NSDictionary的问题,这会使用isEqual:而不是指针比较。但是,除了hashisEqual:之外,您还应该实施Person,以实现此目的。

  

字典中的键值对称为条目。每个条目包含一个表示键的对象和另一个作为键值的对象。在字典中,键是唯一的。也就是说,单个字典中没有两个键是相等的(由isEqual确定:)。

  

如果两个对象相等,则它们必须具有相同的哈希值。如果在子类中定义isEqual:并打算将该子类的实例放入集合中,则最后一点尤为重要。确保您还在子类中定义哈希。

  

从索引0开始,数组的每个元素都会发送一个isEqual:消息,直到找到匹配项或到达数组的末尾。此方法将anObject参数传递给每个isEqual:消息。如果isEqual:对象被认为是相等的:(在NSObject协议中声明)返回YES。


您应该始终阅读文档:正如上面引用的摘录所指出的,这些细节通常在方法的“讨论”或“特殊考虑”部分中解释文档或类文档本身的“概述”部分。

答案 1 :(得分:1)

这与Cocoa的一致性如何(即NSArray的indexofObject:工作方式相同吗?)

这是一致的,同时也不是。我的意思是有两种方法可以使用:isEqualhash。你不应该太在意什么时候使用。您应该关注的是尊重NSObject协议要求,并确保如果两个对象根据isEqual相等,则它们也具有相同的散列。

来自isEqual documentation in the NSObject Protocol Reference

  

如果两个对象相等,则它们必须具有相同的哈希值。这个   如果你定义isEqual:在a中,最后一点尤为重要   子类并打算将该子类的实例放入   采集。确保您还在子类中定义哈希。