2012-02-27 35 views
0

此代码有什么问题?我得到数组枚举期间的应用程序崩溃

Collection <NSCFArray: 0x101e1b6d0> was mutated while being enumerated 

它的NSMutableArray,而不是NSArray的

NSMutableArray *set = [[NSMutableArray alloc]initWithObjects:@"first", @"second", @"third", @"third", nil]; 

    [set enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    { 
     if([obj isEqualToString:@"third"]) 
     { 
      [set removeObjectAtIndex:idx]; 
     } 
    }]; 

    [pool drain]; 

回答

6

您在迭代迭代时不能改变(更改)集合,因为迭代器对象也需要更改。您应该将要删除的对象添加到数组中,然后将其删除。

NSMutableArray *set = [[NSMutableArray alloc]initWithObjects:@"first", @"second", @"third", @"third", nil]; 

NSMutableArray *arrayOfObjectsToRemove = [[NSMutableArray alloc] init]; 
[set enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
{ 
    if([obj isEqualToString:@"third"]) 
    { 
     [arrayOfObjectsToRemove addObject:obj]; 
    } 
}]; 

[set removeObjectsInArray:arrayOfObjectsToRemove]; 

[pool drain];