说我有一个名为对象Person
拥有财产socialSecurityNumber
,而这个类覆盖了isEqual:
时,社会安全号码属性等于方法返回true。 而且说我放了一堆的情况下的Person
进入一个NSDictionary
。
如果我现在实例化一个newPerson
恰好具有相同的社会安全号码作为一个已经在字典中的对象,而我呢[myDictionary objectForKey:newPerson]
将它使用isEqual:
并返回YES,还是会比较指针和回报没有?
我知道我可以写一个简单的测试来找出,但我想知道究竟是如何objectForKey:
在字典中找到匹配,一般是如何保持一致,这是跨越可可(IE浏览器NSArray
的indexofObject:
工作一样吗?)
NSDictionary
作品就像一个哈希表。 因此,它同时使用-hash
和-isEqual:
找到对应于给定键在字典中的对象。
因此,要回答你的问题,为NSDictionary
,这里采用isEqual:
,而不是指针比较。 但你也应该实现hash
除了isEqual:
在你的Person
类这个工作。
一个字典内的关键值对被称为一个条目。 每个条目由表示该密钥和第二对象,该对象是该密钥的值的一个对象的。 在一个字典,键是唯一的。 即,在一个单个词典没有两个密钥相等(如通过确定的isEqual :)。
如果两个对象是相等的,它们必须具有相同的哈希值。 在子类中,并打算把该子类的实例到一个集合:如果你的isEqual定义这最后一点尤为重要。 请确保您还你的子类中定义哈希值。
- 此行为是跨越可可各种容器类是一致的。 例如,从所述
NSArray
的indexOfObject:
方法文档 :
直到找到一个匹配的消息或者到达阵列的端部:在索引0处开始,数组的每个元素被发送的isEqual一个。 此方法通anObject参数到每个isEqual:方法消息。 对象被认为是相等的isEqual如果:(在NSObject的协议声明)返回YES。
您应该始终阅读文档 :如上面引用的提取物中指出,这几样的细节在“讨论”或方法的文档或类文档本身的“概述”部分中的“特殊考虑”的部分都被解释。
如何一致的,这是整个可可(即不NSArray的indexofObject:工作一样吗?)
这是一贯的,在同一时间它不是。 我的意思是,有可以使用的两种方法: isEqual
和hash
。 你不应该过多关注它时使用。 你应该集中精力,就是尊重NSObject
协议要求,并确保两个对象按照相等isEqual
他们也有相同的哈希值。
从isEqual
在文档NSObject
协议参考
如果两个对象是相等的,它们必须具有相同的哈希值。 在子类中,并打算把该子类的实例到一个集合:如果你的isEqual定义这最后一点尤为重要。 请确保您还你的子类中定义哈希值。