Сбой приложения при перечислении массива - PullRequest
0 голосов
/ 27 февраля 2012

Что не так с этим кодом? Я получаю

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

Ответы [ 2 ]

6 голосов
/ 27 февраля 2012

Вы не можете изменить (изменить) коллекцию во время итерации, потому что объект итератора также должен будет измениться. Вы должны добавить объекты, которые вы хотите удалить, в массив и удалить их впоследствии.

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];
6 голосов
/ 27 февраля 2012

Проблема в том, что вы меняете массив во время перечисления. Это не ходи.

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

Лучший способ удалить из NSMutableArray во время итерации?

Все, что вам нужно, это там.

...