为什么removeObjectsinArray需要哈希?

时间:2012-09-22 14:35:18

标签: objective-c xcode nsmutablearray

- (void)removeObjectsInArray:(NSArray *)otherArray
  

从接收数组中移除另一个给定数组中的对象。   此方法类似于removeObject:,但允许您高效   只需一次操作即可删除大量对象。如果收到   array不包含otherArray中的对象,该方法无效   (虽然它确实会产生搜索内容的开销)。这个   方法假定otherArray中的所有元素都响应哈希和   isEqual:方法

我理解removeObjectsinArray需要isEqual

为什么还需要实现对象?

1 个答案:

答案 0 :(得分:3)

来自NSObject documentation

  

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

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

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

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