假设我有一个名为Person
的对象,其属性为socialSecurityNumber
,当社会安全号码属性相等时,此类会覆盖isEqual:
方法以返回true。并说我已将Person
的一堆实例放入NSDictionary
。
如果我现在实例化一个newPerson
对象,该对象恰好具有与字典中已有的相同的社会安全号码,并且[myDictionary objectForKey:newPerson]
,它是否会使用isEqual:
并返回是,还是比较指针并返回NO?
我知道我可以编写一个简单的测试来查找,但我想了解objectForKey:
在字典中找到匹配的确切程度,以及这与Cocoa的一致性(即NSArray
'indexofObject:
的工作方式相同?)
答案 0 :(得分:10)
NSDictionary
就像哈希表一样。因此,它使用-hash
和-isEqual:
来查找字典中与给定键对应的对象。
所以要回答NSDictionary
的问题,这会使用isEqual:
而不是指针比较。但是,除了hash
类isEqual:
之外,您还应该实施Person
,以实现此目的。
字典中的键值对称为条目。每个条目包含一个表示键的对象和另一个作为键值的对象。在字典中,键是唯一的。也就是说,单个字典中没有两个键是相等的(由isEqual确定:)。
如果两个对象相等,则它们必须具有相同的哈希值。如果在子类中定义isEqual:并打算将该子类的实例放入集合中,则最后一点尤为重要。确保您还在子类中定义哈希。
NSArray
's indexOfObject:
method documentation:从索引0开始,数组的每个元素都会发送一个isEqual:消息,直到找到匹配项或到达数组的末尾。此方法将anObject参数传递给每个isEqual:消息。如果isEqual:对象被认为是相等的:(在NSObject协议中声明)返回YES。
您应该始终阅读文档:正如上面引用的摘录所指出的,这些细节通常在方法的“讨论”或“特殊考虑”部分中解释文档或类文档本身的“概述”部分。
答案 1 :(得分:1)
这与Cocoa的一致性如何(即NSArray的indexofObject:工作方式相同吗?)
这是一致的,同时也不是。我的意思是有两种方法可以使用:isEqual
和hash
。你不应该太在意什么时候使用。您应该关注的是尊重NSObject
协议要求,并确保如果两个对象根据isEqual
相等,则它们也具有相同的散列。
来自isEqual
documentation in the NSObject
Protocol Reference
如果两个对象相等,则它们必须具有相同的哈希值。这个 如果你定义isEqual:在a中,最后一点尤为重要 子类并打算将该子类的实例放入 采集。确保您还在子类中定义哈希。