Apple的文档目前没有记录NSSet的“身份”概念。
我有一些似乎来自Apple代码的错误。例如,“[NSMutableSet minusSet]”对我来说永远不会有记录 - 但我很确定这是因为“身份”。
containsObject:
返回一个布尔值,指示给定对象是否为 出现在集合中。
如果集合中存在anObject,则为YES,否则为NO。
那意味着什么?
我试过的所有事情:
答案 0 :(得分:9)
在Cocoa中,使用isEqual:
和 hash:
来自isEqual:
的说明:
如果两个对象相等,则它们必须具有相同的哈希值。如果在子类中定义isEqual:并打算将该子类的实例放入集合中,则最后一点尤为重要。确保您还在子类中定义哈希。
您的子类需要实现这两者,以便它们返回相同的内容。一旦他们这样做,那么他们就可以在Cocoa Collections中正确使用。
你的NSSet
相等不起作用的原因是因为集合使用哈希值(它存储为哈希表),因此如果你只实现了isEqual:
,那么就有机会(很有可能) )他们的哈希会有所不同。
答案 1 :(得分:6)
NSSet
是经典意义上的哈希集,因此您必须实现hash
方法以确保对象被识别为相等。默认情况下,hash
只返回已转换为无符号整数的对象的指针,该整数对于每个对象都是唯一的,因此即使对isEqual:
返回true的对象也不会被识别。如果您对NSSet
的工作感兴趣,可以查看CFSet
source code,这是NSSet
的免费桥接核心基础计数器部分。