假设我有一个对象someObject
和一个NSMutableArray *someArray
。我不确定someObject
是否在数组中,但如果是,我想删除它。有两种选择:
案例1:
if([someArray indexOfObject:someObject] != NSNotFound)
[someArray removeObject:someObject];
案例2:
[someArray removeObject:someObject];
在第2种情况下,如果数组中不存在该对象,则不会发生任何事情。我的问题是,案例2是否更有效,因为在案例1中我必须搜索数组并查看它是否存在,如果存在,我将其删除,但我猜removeObject:
搜索数组再次为那个对象?
答案 0 :(得分:6)
但我猜是removeObject:再次在数组中搜索该对象?
嗯,是的,它必须。在没有查找的情况下,无法在集合中找到对象。* The docs甚至可以这样说:
此方法使用
indexOfObject:
查找匹配项,然后使用removeObjectAtIndex:
删除它们。 [...]如果数组不包含anObject
,则该方法无效(尽管它会产生搜索内容的开销)。
如果您愿意,您当然可以模仿框架并在搜索后立即使用removeObjectAtIndex:
。
*这比它可能更快(最差O(log(N))而不是O(N))因为NSArray
s aren't arrays。
答案 1 :(得分:5)
好吧,你的数组不会记住你搜索过的每个对象。如果出于某种原因,您需要在删除它之前知道它是否存在,您可以避免使用
进行双重搜索NSUInteger tempIndex = [someArray indexOfObject:someObject];
if (tempIndex != NSNotFound)
[someArray removeObjectAtIndex:tempIndex]
else
//in case it wasn't found...
答案 2 :(得分:2)
NSMutableArray
没有(也不能)"记得"当你被要求删除它时,你刚刚搜索了一个对象。因此,调用indexOfObject
后跟removeObject
必须花费更多的工作,而不仅仅是简单地调用removeObject
。
答案 3 :(得分:0)
我会选择案例2并调用removeObject,因为文档说明了
此方法使用indexOfObject:来查找匹配项,然后删除 他们通过使用removeObjectAtIndex:。因此,确定匹配 对象对isEqual:消息的响应的基础。如果 array不包含anObject,该方法没有效果(尽管它 确实会产生搜索内容的开销。)
所以基本上两个代码示例是相同的,除了数组之后可能再次进行另一次检查,因为它不知道你检查了它,所以它只是浪费了一些额外的cpu时间。但是说实话,我现在不会想太多关于这样的例子,只是开发你的应用程序,当谈到优化时,看看你占用所有cpu时间的最新情况并调整这样的情况,因为他们开始真正采取你的cpu时间。