2012-04-30 69 views
3

說我有一個對象someObjectNSMutableArray *someArray。我不確定someObject是否在數組中,但如果是,我想刪除它。有兩個選項:在刪除它之前,我應該檢查一個對象是否存在於一個集合中?

案例1:

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

案例2:

[someArray removeObject:someObject]; 

在案例2中,如果對象不數組中存在的,什麼也沒有發生。我的問題是,案例2效率更高,因爲在案例1中,我必須搜索數組並查看它是否存在,如果存在,我將其刪除,但我猜removeObject:再次搜索該數組?

回答

6

但我猜的removeObject:再次搜索該陣列爲對象?

嗯,是的,它必須如此。有沒有辦法找到一個集合中的對象不看它* The docs甚至這樣說:

此方法使用indexOfObject:找到匹配,然後通過使用removeObjectAtIndex:刪除它們。 [...]如果數組不包含anObject,該方法不起作用(儘管它會導致搜索內容的開銷)。

你當然可以模仿框架,並在搜索後自己使用removeObjectAtIndex:,如果你想。


*這是速度比它可能會(在最壞的情況O(日誌(N)),而不是O(N)),因爲NSArray小號aren't arrays

+0

該鏈接真的很有趣 – Snowman

+2

我會稍微放大一點:不要爲了優化NSArray,NSDictionary,NSString而放棄這種方式。它們很快,所以做得乾乾淨淨。複雜的優化可能不值得,甚至可能會變慢。 – paulmelnikow

2

NSMutableArray不會(也不能)「記住」你剛纔搜索對象時,要求將其刪除。因此,撥打indexOfObject後跟removeObject必然需要比簡單地自己調用removeObject更多的工作。

5

那麼,你的陣列是不會記住每一個對象,你搜索。如果由於某種原因,你需要知道它是否在那裏你刪除它之前,你能避免與

NSUInteger tempIndex = [someArray indexOfObject:someObject]; 
if (tempIndex != NSNotFound) 
    [someArray removeObjectAtIndex:tempIndex] 
else 
    //in case it wasn't found... 
+0

好點!這也發生在我身上。 –

0

的雙重搜索,因爲隨着文檔指出

我會去的情況下,2只需要調用的removeObject

此方法使用indexOfObject:定位匹配,然後通過使用removeObjectAtIndex移除 他們:.因此,在 上確定匹配是對象對isEqual:消息的響應的基礎。如果 數組不包含anObject,則該方法不起作用(儘管其 的確會招致搜索內容的開銷)。

所以基本上2個示例代碼是相同的,不同之處在於該陣列可以以後你再這樣做的另一個檢查,因爲它不知道你檢查,如此它只是一些額外的浪費CPU時間。但誠實地說,我現在不會想太多像這樣的例子,只是開發你的應用程序,當涉及到優化,然後看看什麼是佔用你所有的CPU時間,並調整這樣的情況下,因爲他們開始真正採取增加你的CPU時間。

相關問題