苹果如何实现NSSET



苹果的文档当前不记录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,则否。

那是什么意思?

我尝试过的东西:

  1. 在集合中的所有类中都实现了" iSequal:"
  2. 检查所有类都是同一类(没有子类/超类混乱)
  3. 在集合中的所有类(无效)上实现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的无电话桥梁核心基金会计数器。

最新更新