从NSMutableArray中删除对象

时间:2010-05-03 09:08:06

标签: objective-c cocoa nsmutablearray

我偶然发现了以下设置for循环的快捷方式(与我一直使用的教科书示例相比,快捷方式):

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

与较长的格式相反:

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

如果我使用较短的版本,有没有办法删除当前正在迭代的项目(即'i')?或者我需要使用更长的格式吗?

5 个答案:

答案 0 :(得分:31)

fast-enumerating时,您无法从阵列中删除对象:

  

计算是“安全的” - 枚举者   有一个变异防守,所以如果你   尝试修改集合   在枚举期间,例外情况是   提高。

无论如何,为什么你需要在枚举时更换容器?考虑存储需要删除的元素,并使用removeObjectsInArray:removeObjectsAtIndexes:方法将其从容器中删除。

答案 1 :(得分:9)

删除项目后,只需添加关键字break;

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

答案 2 :(得分:3)

在枚举期间不得修改Objective-C集合。

您可以使用此变体从集合中删除对象:

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

答案 3 :(得分:1)

前一个循环是Objective C中的“for-each”循环。

* i是指向items-Array中直接项的指针(大部分时间都是NSMutableArray)。

这样您就可以直接在项目上操作:

[items removeObject: i];

这(应该)工作 - 我目前没有在我的Mac上工作,无法检查它。 但是,Objective-C可能会在迭代集合时阻止删除对象(在大多数语言中都很常见)。

答案 4 :(得分:0)

我使用此代码:

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