5

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

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

我知道我可以编写一个简单的测试来找出答案,但我想了解如何objectForKey:在字典中准确找到匹配项,以及这在 Cocoa 中的一致性如何(即NSArray' 的indexofObject:工作方式是否相同?)

4

2 回答 2

10

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

所以要回答你的问题NSDictionary,这使用isEqual:而不是指针比较。但是你还应该hashisEqual:你的Person类上实现它才能工作。

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

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

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


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

于 2012-09-13T09:52:15.080 回答
1

这在 Cocoa 中的一致性如何(即 NSArray 的 indexofObject: 是否相同?)

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

来自协议参考isEqual中的文档NSObject

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

于 2012-09-13T10:06:43.450 回答