【问题标题】:How has Apple implemented NSSet?Apple 是如何实现 NSSet 的?
【发布时间】:2012-11-07 13:51:01
【问题描述】:

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(无效)

【问题讨论】:

    标签: objective-c nsset


    【解决方案1】:

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

    完成的

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

    来自isEqual:的注释:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多