单个对象上的 removeObject 与 removeObjectAtIndex 之间有什么性能差异?

Any performance difference between removeObject vs removeObjectAtIndex on a single object?

NSMutableArray 中删除单个对象时 removeObjectAtIndex faster/more 是否比 removeObject 更有效?我假设是这样,因为搜索应该更快。

如果预计大型数组会有显着差异,我会跟踪索引。因此,问题。

removeObjectAtIndex: 会比 removeObject:.

快很多(相对而言)

removeObjectAtIndex: 只删除一个对象和一个特定的已知索引。这是 O(1).

removeObject: 必须迭代整个数组并删除对象的每个实例。它必须对数组中的每个对象调用 isEqual:。这需要更多的处理。这是 O(n).

综上所述,它是否真的是性能问题取决于数组的大小和数组中的对象。

除非您有理由怀疑性能问题并且使用 Instruments 查看是否真的存在问题,否则不要担心此类问题。

- (void)removeObjectAtIndex:(NSUInteger)index

为了填补空白,所有超出索引的元素都通过从其索引中减去 1 来移动

- (void)removeObject:(ObjectType)anObject

此方法使用 indexOfObject: 定位匹配项,然后使用 removeObjectAtIndex: 删除它们。因此,匹配是根据对象对 isEqual: 消息的响应来确定的。如果数组不包含 anObject,则该方法无效(尽管它确实会产生搜索内容的开销)。

- (NSUInteger)indexOfObject:(ObjectType)anObject

从索引 0 开始,向数组的每个元素发送一个 isEqual: 消息,直到找到匹配项或到达数组末尾。此方法将 anObject 参数传递给每个 isEqual: 消息。如果 isEqual 对象被认为是相等的:(在 NSObject 协议中声明)returns YES.

案例 1:从数组中删除最后一个对象。

  • removeObjectAtIndex 将删除最后一个对象并且没有移动 require 所以它需要 O(1) 时间。
  • removeObject 将调用 indexOfObject:这将花费 O(n) + removeObjectAtIndex 将花费 O(1) ~ O(n)。

案例 2: 从数组中删除第一个对象。

  • removeObjectAtIndex 将删除第一个对象并移动 n-1 个对象。 这将花费 O(n-1) ~ O(n)。
  • removeObject 将调用 indexOfObject:这将花费 O(1) + removeObjectAtIndex 将花费 O(n-1) ~ O(n)。

案例 3 从数组中删除中间对象

  • removeObjectAtIndex 将删除中间对象并移动 n/2 对象。 这将花费 O(n/2).
  • removeObject 将调用 indexOfObject:这将花费 O(n/2) + removeObjectAtIndex 将花费 O(n/2) ~ O(n).

如果你有对象的索引,最好调用 removeObjectAtIndex: