5

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

我有一些似乎来自 Apple 代码的错误。例如,“[NSMutableSet minusSet]”从来没有像记录的那样对我有用——但我很确定这是因为“身份”。

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

包含对象:

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

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

这意味着什么?

仅供参考我尝试过的事情:

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

2 回答 2

9

在 Cocoa 中,对象相等是通过使用isEqual: and hash:

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

从注释中isEqual:

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

您的子类将需要实现这两个,以便它们返回相同的东西。一旦他们这样做了,就可以在 Cocoa Collections 中正确使用它们。

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

于 2012-11-07T13:55:44.493 回答
6

NSSet是经典意义上的哈希集,因此您必须实现该hash方法以确保对象被识别为相等。默认情况下,hash只返回转换为无符号整数的对象的指针,该整数对于每个对象都是唯一的,因此即使返回 true 的对象isEqual:也不会被识别为这样。如果您对它的工作方式感兴趣NSSet,可以查看CFSet源代码,它是NSSet.

于 2012-11-07T13:53:05.363 回答