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

Sno*_*man 3 collections cocoa objective-c

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

情况1:

if([someArray indexOfObject:someObject] != NSNotFound)
   [someArray removeObject:someObject];
Run Code Online (Sandbox Code Playgroud)

案例2:

[someArray removeObject:someObject];
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*ell 6

但我猜是removeObject:再次搜索该对象的数组?

嗯,是的,它必须.没有找到它就无法在集合中找到对象.*文档甚至会这样说:

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

您当然可以模仿框架,并removeObjectAtIndex:在搜索后立即使用自己.


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

  • 我将稍微放大一点,说:不要试图优化NSArray,NSDictionary,NSString.他们很快,所以做得很干净.复杂的优化可能不值得,甚至可能更慢. (3认同)

mac*_*rth 5

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

NSUInteger tempIndex = [someArray indexOfObject:someObject];
if (tempIndex != NSNotFound)
   [someArray removeObjectAtIndex:tempIndex]
else
   //in case it wasn't found...
Run Code Online (Sandbox Code Playgroud)