This code runs without crashing and I don't see anything in the documentation, but is it really safe?
[mutableArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// do some stuff to obj before removing it
[mutableArray removeObject:obj];
}];
I think this should not be done.
As in enumeration the object is treated as const.
I tried same code, I received following error:
Collection <__NSArrayM: 0x10053b8d0> was mutated while being enumerated.
The Code:
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);
}];
This is something you should never do. Instead, collect all the element indexes into an NSMutableIndexSet
object and then later use the removeObjectsAtIndexes:
to remove all of the objects at once.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With