难道的NSDictionary的objectForKey:依靠身份或平等?(Does NSDicti

2019-09-22 09:40发布

说我有一个名为对象Person拥有财产socialSecurityNumber ,而这个类覆盖了isEqual:时,社会安全号码属性等于方法返回true。 而且说我放了一堆的情况下的Person进入一个NSDictionary

如果我现在实例化一个newPerson恰好具有相同的社会安全号码作为一个已经在字典中的对象,而我呢[myDictionary objectForKey:newPerson]将它使用isEqual:并返回YES,还是会比较指针和回报没有?

我知道我可以写一个简单的测试来找出,但我想知道究竟是如何objectForKey:在字典中找到匹配,一般是如何保持一致,这是跨越可可(IE浏览器NSArrayindexofObject:工作一样吗?)

Answer 1:

NSDictionary作品就像一个哈希表。 因此,它同时使用-hash-isEqual:找到对应于给定键在字典中的对象。

因此,要回答你的问题,为NSDictionary ,这里采用isEqual: ,而不是指针比较。 但你也应该实现hash除了isEqual:在你的Person类这个工作。

  • 从的NSDictionary类参考文档 :

一个字典内的关键值对被称为一个条目。 每个条目由表示该密钥和第二对象,该对象是该密钥的值的一个对象的。 在一个字典,键是唯一的。 即,在一个单个词典没有两个密钥相等(如通过确定的isEqual :)。

  • isEqual:方法的文档 :

如果两个对象是相等的,它们必须具有相同的哈希值。 在子类中,并打算把该子类的实例到一个集合:如果你的isEqual定义这最后一点尤为重要。 请确保您还你的子类中定义哈希值。

  • 此行为是跨越可可各种容器类是一致的。 例如,从所述NSArrayindexOfObject:方法文档 :

直到找到一个匹配的消息或者到达阵列的端部:在索引0处开始,数组的每个元素被发送的isEqual一个。 此方法通anObject参数到每个isEqual:方法消息。 对象被认为是相等的isEqual如果:(在NSObject的协议声明)返回YES。


您应该始终阅读文档 :如上面引用的提取物中指出,这几样的细节在“讨论”或方法的文档或类文档本身的“概述”部分中的“特殊考虑”的部分都被解释。



Answer 2:

如何一致的,这是整个可可(即不NSArray的indexofObject:工作一样吗?)

这是一贯的,在同一时间它不是。 我的意思是,有可以使用的两种方法: isEqualhash 。 你不应该过多关注它时使用。 你应该集中精力,就是尊重NSObject协议要求,并确保两个对象按照相等isEqual他们也有相同的哈希值。

isEqual在文档NSObject协议参考

如果两个对象是相等的,它们必须具有相同的哈希值。 在子类中,并打算把该子类的实例到一个集合:如果你的isEqual定义这最后一点尤为重要。 请确保您还你的子类中定义哈希值。



文章来源: Does NSDictionary's objectForKey: rely on identity or equality?