在使用enumerateObjectsUsingBlock:枚举对象时,使用removeObject:安全吗?

4

这段代码可以正常运行,文档中也没有任何提示,但它真的安全吗?

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

这里有一些有用的答案:Objective C中的“在枚举时修改了集合”错误 - Monolo
2个回答

6
我认为不应该这样做。
因为在枚举中,对象被视为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);
}];

即使在发布了这个答案之后,我仍然在想错误信息中说的NSArrayM被改变,它是M而不是I。那么为什么可变数组不能被改变呢? - Anoop Vaidya
1
由于在枚举期间集合不得被改变(请参见“重复问题”的答案),因此无论集合是否可变都无关紧要。 - Martin R

5

这是您绝不能做的事情。相反,将所有元素索引收集到一个NSMutableIndexSet对象中,然后稍后使用removeObjectsAtIndexes:一次性删除所有对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接