在删除之前,我应该检查集合中是否存在对象吗?

时间:2012-04-30 19:56:10

标签: objective-c cocoa collections

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

案例1:

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

案例2:

[someArray removeObject:someObject];

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

4 个答案:

答案 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时间。