for in数组时, 同时对其进行删减操作, 崩溃
崩溃代码
// forin 里面删减数组元素, 必须加break
for (NSString *str in arr) {
if ([str isEqualToString:@"002"]) {
[arr addObject:@"004"];// 不加break会崩溃
//*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x600000255f00> was mutated while being enumerated.'
}
}
*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x1c084da70> was mutated while being enumerated.'
*** First throw call stack:
(0x182093d38 0x1815a8528 0x1820933c4 0x101b92258 0x1874b4580 0x1874b52b8 0x1874c3850 0x10700549c 0x10700545c 0x107014110 0x1070089a4 0x107009e8c 0x18203bf20 0x182039afc 0x181f5a2d8 0x183debf84 0x18b507880 0x1029ea770 0x181a7e56c)
原因
数组for in遍历时, 不能对其删减操作
解决方案
方法1
// forin 里面删减数组元素, 必须加break
for (NSString *str in arr) {
if ([str isEqualToString:@"002"]) {
[arr addObject:@"004"];// 不加break会崩溃
//*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x600000255f00> was mutated while being enumerated.'
break; //必须加break, 否则崩溃
}
}
方法2
// 不会崩溃
for (int i = 0; i < arr.count; i++) {
NSString *str = arr[i];
if ([str isEqualToString:@"002"]) {
[arr addObject:@"005"];
}
}
方法3 利用enumerateObjectsUsingBlock
// enum不会崩溃
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isEqualToString:@"002"]) {
[arr addObject:@"006"];
*stop = YES;
}
}];