用for循環(huán)遍歷了可變對(duì)象,同時(shí)對(duì)可變對(duì)象進(jìn)行增加、刪除操作會(huì)報(bào)此錯(cuò)誤:
- reason: Collection <__NSArrayM: 0x60800005bd50> was mutated while being enumerated
解決辦法:
① 操作完成立刻跳出循環(huán)
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5" , nil];
for (NSString *str in array) {
if ([str isEqualToString:@"2"]) {
[array removeObject:@"0"];
break;
}
}
注意:用 continue 跳出還是會(huì)報(bào)錯(cuò),必須結(jié)束循環(huán)
② 遍歷copy后的對(duì)象
for (NSString *str in [array copy]) {
if ([str isEqualToString:@"2"]) {
[array addObject:@"0"];
}
}
③ 開(kāi)線程去執(zhí)行操作
for (NSString *str in array) {
if ([str isEqualToString:@"2"]) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[array addObject:@"0"];
});
}
}
④ 更換遍歷方式
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"2"]) {
[array removeObject:obj];
// *stop = true;
}
}];
話題延伸:
@property (atomic, strong)NSMutableArray *array;
原子屬性修飾的對(duì)象是安全的,那么以上屬性是安全的嗎?
面試中可能會(huì)遇到這樣的問(wèn)題,atomic修飾只是說(shuō)此對(duì)象setter & getter 方法是安全的,對(duì)象本身并不是安全的;
@property (nonatomic, copy)NSMutableArray *array;
對(duì)這個(gè)數(shù)組進(jìn)行增加、刪除操作會(huì)報(bào)錯(cuò)嗎?
會(huì), 打印對(duì)象的類型就看到了:
@property (nonatomic, copy)NSMutableArray *array1;
@property (nonatomic, strong)NSMutableArray *array2;
NSLog(@"%@, ", [self.array1 class]);
NSLog(@"%@, ", [self.array2 class]);
2016-11-14 17:55:15.053 TestArray[26252:1532398] __NSArrayI,
2016-11-14 17:55:15.055 TestArray[26252:1532398] __NSArrayM,
沒(méi)有經(jīng)過(guò)copy修飾的是Mutable類型,經(jīng)過(guò)copy修飾的是Immutable類型
以上代碼均經(jīng)過(guò)測(cè)試,如有不妥的地方希望指正!