苹果的文档当前不记录NSSET的"身份"概念。
我有一些来自Apple代码的错误。例如," [nsmutableset minusset]"从未像我记录的那样对我有用 - 但我很确定这是因为"身份"。
例如。来自:http://developer.apple.com/library/mac/#documentation/cocoa/cocoa/reference/foundation/foundation/classes/nsetset_class/reference/reference/reference.html#/apple_reff/apple_reff/occ/ccc/cl/nsset
包含:
返回一个布尔值,该值指示给定对象是否为 在集合中存在。
是,如果集合中存在AnObject,则否。
那是什么意思?
我尝试过的东西:
- 在集合中的所有类中都实现了" iSequal:"
- 检查所有类都是同一类(没有子类/超类混乱)
- 在集合中的所有类(无效)上实现nscopy
在可可中,对象平等是通过使用isEqual:
和 hash:
https://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/foundation/protocols/nsobject_protocol/referencocol/reference/nsobject.html
从isEqual:
的注释中:
如果两个对象相等,则必须具有相同的哈希值。如果您定义Isqual:在一个子类中,并打算将该子类的实例放入一个集合中,那么最后一点尤其重要。确保您还在子类中定义哈希。
您的子类需要实现这两个,以便它们返回同一件事。一旦他们这样做,就可以在可可收藏中正确使用。
您的 NSSet
平等行不通的原因是,设置使用哈希(将其存储为哈希表),因此,如果您仅实现了isEqual:
,那么他们的哈希斯就会有不同的机会。
NSSet
是经典意义上的哈希集,因此您必须实现hash
方法以确保对象被识别为相等。默认情况下,hash
只需返回施放在无符号整数的对象的指针,该对象对于每个对象都是唯一的,因此即使是返回 isEqual:
的对象,也无法识别为这样的对象。如果您对NSSet
的工作感兴趣,则可以查看CFSet
源代码,该代码是NSSet
的无电话桥梁核心基金会计数器。