iOS, for in数组时, 同时对其进行删减操作崩溃

 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;
        }
    }];

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值