2012-02-27 1 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

Проблема заключается в том вы изменяете массив во время перечисления. Это нехорошо.

Пожалуйста, прочтите выбранный ответ на

Best way to remove from NSMutableArray while iterating?

Все, что нужно есть.

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]; 

 Смежные вопросы

  • Нет связанных вопросов^_^