2010-05-03 35 views
15

卸下對象我橫跨以下快捷設立絆倒一個for循環(快捷相比我已經使用教科書的例子):從的NSMutableArray

for (Item *i in items){ ... } 

與之相對較長的格式:

for (NSInteger i = 0; i < [items count]; i++){ ... } //think that's right 

如果我使用較短的版本,有沒有辦法刪除當前正在迭代的項目(即'我')?或者我需要使用更長的格式?

+0

第一個for循環被稱爲增強的for循環,而第二一個是舊的FOR循環標準。我在做Java認證時學到了這一點。 – Popeye 2012-08-10 21:58:39

+0

如果您確實需要在迭代它時刪除數組中的項目,並且您不能使用removeObjectsInArray:或removeObjectsAtIndexes:像@Vladimir建議的那樣將它們刪除,那麼您總是可以迭代原始數組的副本。 – Tiago 2014-08-04 16:14:26

回答

31

fast-enumerating它不能從陣列中刪除對象:

記數是「安全的」誠枚舉 具有突變後衛,這樣,如果你 試圖枚舉過程中修改集合 ,一個例外是提出了 。

無論如何,你爲什麼需要在枚舉時更改容器?考慮存儲需要刪除的元素,並使用removeObjectsInArray:removeObjectsAtIndexes:方法將其從容器中刪除。

+0

謝謝。枚舉時我正在改變它,因爲它是一個臨時隊列。我將所有項目移動到另一個陣列。 – 2010-05-03 18:27:52

+1

如果將所有對象移動到另一個數組,請嘗試以下操作:[destinationArray addObjectsFromArray:sourceArray]; [sourceArray removeAllObjects];' – JeremyP 2010-05-04 08:29:10

+0

是的,我發現 - 謝謝。 – 2010-05-06 04:25:13

1

前者環是「的for-each」在目的C.

循環* i是一個指針,指向直接項目中的項-陣列(大多數時間,這將是NSMutableArray裏)。

這樣你就可以直接對項目進行操作:

[items removeObject: i]; 

這(應該)的工作 - 我目前沒有工作在我的Mac,不能檢查。 但是,它可能是Objective-C在迭代集合時阻止移除對象(這在大多數語言中很常見)。

+0

確實如此,枚舉時不能移除(或變異)一個'NSMutableArray',所以'removeObject:'調用會引發一個異常。 (弗拉基米爾在他的回答中解釋) – 2010-05-03 10:07:34

9

只需添加關鍵字break;去除項目後,...

for(id item in items) { 
    if([item isEqual:itemToDelete]) { 
     [items removeObject:item]; 
     break; 
    } 
} 
+4

@ Abdullah71與你從不使用*的ID。 – rptwsthi 2013-07-05 06:36:38

+0

這將刪除一個對象並停止迭代,從而丟失應該刪除的其他對象。所以只有在每次迭代需要刪除零到一個對象時才使用它。 – marsbear 2016-08-18 15:34:48

3

Objective-C的集合不能枚舉過程中被修改。

你可以使用這個變體從集合刪除對象:

for (NSInteger i = items.count - 1; i >= 0 ; i--) { 
    [items removeObjectAtIndex:i]; 
} 
+0

Imho是正確執行此操作的最短途徑,因爲您的業務邏輯可以很好地從後向前遍歷數組。 – marsbear 2016-08-18 15:37:23

0

我用這個代碼是:

for (NSUInteger i = [items count] - 1; ; i--) { 
    [items removeObjectAtIndex:i]; 
} 
+0

無限循環? – Pang 2016-01-15 03:28:45

+0

直到我得到-1 ...然後它崩潰:) – marsbear 2016-08-18 15:35:50