Apple如何实施NSSet?

时间:2012-11-07 13:51:01

标签: objective-c nsset

Apple的文档目前没有记录NSSet的“身份”概念。

我有一些似乎来自Apple代码的错误。例如,“[NSMutableSet minusSet]”对我来说永远不会有记录 - 但我很确定这是因为“身份”。

e.g。来自:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.html#//apple_ref/occ/cl/NSSet

  

containsObject:

     

返回一个布尔值,指示给定对象是否为   出现在集合中。

     

如果集合中存在anObject,则为YES,否则为NO。

那意味着什么?

我试过的所有事情:

  1. 在集合
  2. 中的所有类上实现了“isEqual:”
  3. 检查所有类是否是同一个类(没有子类/超类混淆)
  4. 对集合中的所有类实现NSCopying(无效)

2 个答案:

答案 0 :(得分:9)

在Cocoa中,使用isEqual: hash:

完成对象相等

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html

来自isEqual:的说明:

  

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

您的子类需要实现这两者,以便它们返回相同的内容。一旦他们这样做,那么他们就可以在Cocoa Collections中正确使用。

你的NSSet相等不起作用的原因是因为集合使用哈希值(它存储为哈希表),因此如果你只实现了isEqual:,那么就有机会(很有可能) )他们的哈希会有所不同。

答案 1 :(得分:6)

NSSet是经典意义上的哈希集,因此您必须实现hash方法以确保对象被识别为相等。默认情况下,hash只返回已转换为无符号整数的对象的指针,该整数对于每个对象都是唯一的,因此即使对isEqual:返回true的对象也不会被识别。如果您对NSSet的工作感兴趣,可以查看CFSet source code,这是NSSet的免费桥接核心基础计数器部分。