lms*_*lms 5 cocoa cocoa-touch objective-c foundation
假设我有一个名为的对象Person具有该属性socialSecurityNumber,并且isEqual:当社会安全号属性相等时,此类将覆盖该方法以返回true.并说我把一堆实例Person放入了NSDictionary.
如果我现在实例化一个newPerson恰好具有与字典中已有的社会安全号相同的对象,并且我这样做[myDictionary objectForKey:newPerson],它会使用isEqual:并返回YES,还是会比较指针并返回NO?
我知道我可以编写一个简单的测试来查找,但我想了解objectForKey:在字典中是如何找到匹配的,并且通常在Cocoa中是如何一致的(即它NSArray的indexofObject:工作是否相同?)
Ali*_*are 10
NSDictionary像哈希表一样工作.因此它使用两者-hash并-isEqual:在字典中找到与给定键对应的对象.
所以要回答你的问题NSDictionary,这是使用isEqual:而不是指针比较.但你也应该实施hash除了isEqual:在你的Person类这个工作.
字典中的键值对称为条目.每个条目包含一个表示键的对象和另一个作为键值的对象.在字典中,键是唯一的.也就是说,单个字典中没有两个键是相等的(由isEqual :)确定.
如果两个对象相等,则它们必须具有相同的哈希值.如果在子类中定义isEqual:并打算将该子类的实例放入集合中,则最后一点尤为重要.确保您还在子类中定义哈希.
NSArray的indexOfObject:方法的文档:从索引0开始,数组的每个元素都发送一个isEqual:消息,直到找到匹配或到达数组的末尾.此方法将anObject参数传递给每个isEqual:消息.如果isEqual :(在NSObject协议中声明)返回YES,则认为对象是相等的.
您应该始终阅读文档:正如上面引用的摘录所指出的,这些细节通常在方法文档的"讨论"或"特殊考虑"部分或类文档本身的"概述"部分中进行说明. .