【问题标题】:Why removeObjectsinArray require hash?为什么 removeObjectsinArray 需要哈希?
【发布时间】:2012-09-22 14:35:18
【问题描述】:
- (void)removeObjectsInArray:(NSArray *)otherArray

从接收数组中删除另一个给定数组中的对象。 此方法类似于 removeObject:,但可以让您高效地 只需一次操作即可删除大量对象。如果接收 数组不包含otherArray中的对象,该方法无效 (尽管它确实会产生搜索内容的开销)。这 方法假定 otherArray 中的所有元素都响应 hash 并且 isEqual:.

我知道 removeObjectsinArray 需要 isEqual

为什么它也需要实现对象?

【问题讨论】:

    标签: objective-c xcode nsmutablearray


    【解决方案1】:

    来自NSObject documentation

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

    如果您覆盖-isEqual:,建议您也覆盖-hash。所以这是第一个原因 - 他们不在 -removeObjectsInArray: 文档中提出相同的建议是不一致的。

    第二个原因更微妙。作为经验丰富的开发人员,您可以假设-hash 不会用于实现-removeObjectsInArray:(或通过实验找到它),并且您可以不在对象上实现它而侥幸逃脱。但是,Apple 明确表示他们保留在他们的实施中使用 -hash 的权利,如果他们认为值得优化的话,并且你应该实施它以防万一。

    (我不知道他们是否在当前的实现中使用它)

    【讨论】:

    • 值得注意的是,从最近的 iOS 版本(6.0?)开始,Apple 现在在执行-removeObjectsInArray: 时使用-hash,而以前没有。这破坏了我们的代码,因为我们错误地假设,正如你所说的那样!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2011-04-25
    • 2019-05-27
    • 2021-01-01
    • 2015-09-19
    • 2011-09-30
    • 2023-04-06
    相关资源
    最近更新 更多