2013-04-01 3 views
2

Этот код работает без сбоев, и я ничего не вижу в документации, но действительно ли это безопасно?Безопасно ли использовать removeObject: во время enumerateObjectsUsingBlock :?

[mutableArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    // do some stuff to obj before removing it 
    [mutableArray removeObject:obj]; 
}]; 
+0

Некоторые полезные ответы здесь: [Коллекция была мутирована при перечислении ошибки в объективе C] (http://stackoverflow.com/questions/14457369/collection-was-mutated-while-being-enumerated-error-in-objective -c) – Monolo

ответ

5

Я думаю, что это не должно быть сделано.

Как и при перечислении, объект рассматривается как const.

Я попробовал этот код, я получил следующее сообщение об ошибке:

Collection <__NSArrayM: 0x10053b8d0> was mutated while being enumerated. 

Кодекс:

NSMutableArray *mutableArray=[NSMutableArray new]; 
[mutableArray addObject:@"A"]; 
[mutableArray addObject:@"Ab"]; 
[mutableArray addObject:@"Ac"]; 
[mutableArray addObject:@"Ad"]; 

[mutableArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    // do some stuff to obj before removing it 
    [mutableArray removeObject:obj]; 
    NSLog(@"--->%@",mutableArray); 
}]; 
+0

Даже после публикации этого ответа, я задаюсь вопросом об ошибке: «NSArrayM мутатирован», это 'M' не' I'. поэтому почему бы не мутировать mutableArray. –

+1

Поскольку коллекции не должны мутироваться во время перечисления (см. Ответы на «дублирующий вопрос»). Не имеет значения, изменена ли коллекция или нет. –

4

Это то, что вы никогда не должны делать. Вместо этого собирайте все индексы элементов в объект NSMutableIndexSet, а затем используйте removeObjectsAtIndexes: для удаления всех объектов одновременно.

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