【Bug-iOS】Collection <__NSArrayM: 0x> was mutated while being enumerated.

NSMutableArray *mArr = [ NSMutableArray array ];
for ( int i = 0 ; i < 10 ; i ++) {
    NSMutableDictionary *mDic = [NSMutableDictionary dictionary];
    [mDic setObject:[NSString stringWithFormat:
@"%d" , i] forKey: @"a" ];
    [mArr addObject:mDic];
}
// 移除 mArr 中的某元素
// 错误的:
for (NSMutableDictionary *dic in mArr) {
   
if ([dic[ @"a" ] isEqualToString: @"3" ]) {
        [mArr removeObject:dic];
    }
}
//for-in 循环的遍历内容不能被改变,是因为如果移除其遍历的内容便会少一个,而系统是不会允许这个发生的,所以就会 crash... 但是当改变遍历的最后一个内容时,就不会 crash ,因为此时遍历已经结束,结束之后对内容进行修改是允许的。

// 正确的:
// 方法 1.
[mArr enumerateObjectsUsingBlock:^(
id obj, NSUInteger idx, BOOL *stop) {
    if ([[obj objectForKey: @"a" ] isEqualToString: @"3" ]) {
        *stop = YES ;
        [mArr removeObject:obj];
    }
}];
// 方法 2.
NSArray *arr = [ NSArray arrayWithArray : mArr ];
for (NSMutableDictionary *dic in arr) {
   
if ([dic[ @"a" ] isEqualToString: @"3" ]) {
        [mArr removeObject:dic];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值