3

假设我有一个对象someObject和一个NSMutableArray *someArray. 我不确定是否someObject在数组中,但如果是,我想删除它。有两种选择:

情况1:

if([someArray indexOfObject:someObject] != NSNotFound)
   [someArray removeObject:someObject];

案例二:

[someArray removeObject:someObject];

在情况 2 中,如果数组中不存在对象,则不会发生任何事情。我的问题是,案例 2 是否更有效,因为在案例 1 中,我必须搜索数组并查看它是否存在,如果存在,我将其删除,但我猜测removeObject:再次搜索数组以查找该对象?

4

4 回答 4

6

但我猜 removeObject: 再次在数组中搜索该对象?

嗯,是的,它必须。如果不查找,就无法在集合中找到对象。*文档甚至这样说:

此方法用于indexOfObject:定位匹配项,然后使用 删除它们removeObjectAtIndex:。[...]如果数组不包含anObject,则该方法无效(尽管它确实会产生搜索内容的开销)。

如果需要,您当然可以在搜索后立即模仿框架并使用removeObjectAtIndex:自己。


*这比它可能更快(最坏的情况是 O(log(N)) 而不是 O(N)),因为NSArrays不是数组

于 2012-04-30T19:58:52.153 回答
5

好吧,您的数组不会记住您搜索的每个对象。如果由于某种原因您需要在删除它之前知道它是否存在,您可以避免双重搜索

NSUInteger tempIndex = [someArray indexOfObject:someObject];
if (tempIndex != NSNotFound)
   [someArray removeObjectAtIndex:tempIndex]
else
   //in case it wasn't found...
于 2012-04-30T20:03:28.920 回答
2

NSMutableArray不会(也不能)“记住”您在被要求删除时刚刚搜索了一个对象。因此,调用indexOfObject后跟removeObject必然比简单地调用removeObject本身需要更多的工作。

于 2012-04-30T19:58:49.143 回答
0

我会选择案例 2,然后调用 removeObject,因为正如文档所述

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

所以基本上这两个代码示例是相同的,除了数组可能会在你之后再次检查,因为它不知道你检查过,所以它只是浪费了一些额外的 cpu 时间。但老实说,我现在不会想太多这样的例子,只是开发你的应用程序,当涉及到优化时,看看是什么占用了你所有的 cpu 时间,并在它们开始真正占用时调整这样的案例增加你的 CPU 时间。

于 2012-05-01T02:27:38.010 回答