假设我有一个名为Person
拥有以下财产socialSecurityNumber
,并且这个类覆盖了isEqual:
当社会保障号属性相等时返回 true 的方法。并说我已经放了一堆实例Person
进入一个NSDictionary
.
如果我现在实例化一个newPerson
对象恰好具有与字典中已有的社会安全号码相同的社会安全号码,并且我确实如此[myDictionary objectForKey:newPerson]
,它会使用isEqual:
并返回 YES,或者比较指针并返回 NO?
我知道我可以编写一个简单的测试来找出答案,但我想了解到底如何objectForKey:
在字典中找到匹配项,以及通常这在 Cocoa 中的一致性(即NSArray
's indexofObject:
工作一样吗?)
NSDictionary
工作原理类似于哈希表。所以它同时使用-hash
and -isEqual:
在字典中查找与给定键对应的对象。
所以回答你的问题NSDictionary
,这使用isEqual:
而不是指针比较。但你也应该实施hash
此外isEqual:
在你的Person
类以使其发挥作用。
- 来自NSDictionary 类参考文档 https://developer.apple.com/library/ios/#documentation/cocoa/reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html:
字典中的键值对称为条目。每个条目都包含一个表示键的对象和第二个表示该键的值的对象。在字典中,键是唯一的。也就是说,单个字典中没有两个键是相等的(由 isEqual: 确定)。
- 来自isEqual:方法文档 https://developer.apple.com/library/ios/#documentation/cocoa/reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/isEqual::
如果两个对象相等,则它们必须具有相同的哈希值。如果您在子类中定义 isEqual: 并打算将该子类的实例放入集合中,那么最后一点尤其重要。确保您还在子类中定义了哈希。
- 这种行为在 Cocoa 中的各种容器类中是一致的。例如,从NSArray's indexOfObject:方法文档 https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html:
从索引 0 开始,向数组的每个元素发送 isEqual: 消息,直到找到匹配项或到达数组末尾。此方法将 anObject 参数传递给每个 isEqual: 消息。如果 isEqual:(在 NSObject 协议中声明)返回 YES,则对象被视为相等。
您应该始终阅读文档:正如上面引用的摘录所指出的,这些细节通常在方法文档的“讨论”或“特殊考虑”部分或类文档本身的“概述”部分中进行解释。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)