删除for循环中的项目没有副作用?

时间:2011-04-28 23:43:25

标签: objective-c for-loop nsmutablearray nsarray fast-enumeration

我可以删除我在Objective-C for循环中循环的项目而没有副作用吗?

例如,这样可以吗?

for (id item in items) {
   if ( [item customCheck] ) {
      [items removeObject:item];   // Is this ok here?
}

3 个答案:

答案 0 :(得分:12)

不,如果在快速枚举for循环中改变数组,则会出现错误。制作数组的副本,迭代它,然后从原始数据中删除。

NSArray *itemsCopy = [items copy];

for (id item in itemsCopy) {
   if ( [item customCheck] )
      [items removeObject:item];   // Is this ok here
}

[itemsCopy release];

答案 1 :(得分:3)

Nope:

  

枚举是“安全的” - 枚举器具有变异防护,因此如果您在枚举期间尝试修改集合,则会引发异常。

Using Enumerators中给出了更改要枚举的数组的选项:复制数组并枚举,或者构建循环后使用的索引集。

答案 2 :(得分:0)

你可以这样删除:

    //Create array
    NSMutableArray* myArray = [[NSMutableArray alloc] init];

    //Add some elements
    for (int i = 0; i < 10; i++) {
        [myArray addObject:[NSString stringWithFormat:@"i = %i", i]];
    }

    //Remove some elements =}
    for (int i = (int)myArray.count - 1; i >= 0 ; i--) {
        if(YES){
            [myArray removeObjectAtIndex:i];
        }
    }