2010-05-03 38 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