在enumerateObjectsUsingBlock期间使用removeObject是否安全:?

lav*_*voy 4 objective-c foundation nsarray

这段代码运行时没有崩溃,我在文档中看不到任何内容,但是它真的安全吗?

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

Ano*_*dya 6

我认为不应该这样做.

与枚举一样,对象被视为const.

我尝试了相同的代码,我收到以下错误:

Collection <__NSArrayM: 0x10053b8d0> was mutated while being enumerated.
Run Code Online (Sandbox Code Playgroud)

代码:

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);
}];
Run Code Online (Sandbox Code Playgroud)


小智 5

这是你永远不应该做的事情.相反,将所有元素索引收集到一个NSMutableIndexSet对象中,然后使用它removeObjectsAtIndexes:一次删除所有对象.