bug*** Terminating app due to uncaught exception ‘NSGenericException’, reason: ‘*** Collection <__NS

本文介绍了解决iOS开发中遍历数组并同时修改导致程序崩溃的方法。提供了两种解决方案:一是复制数组进行操作;二是使用block进行遍历与修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bug*** Terminating app due to uncaught exception ‘NSGenericException’, reason: ‘*** Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.’

当程序出现这个提示的时候,是因为你一边遍历数组,又同时修改这个数组里面的内容,导致崩溃,

方法一:

网上的方法如下:这种方法就是在定义一个一模一样的数组,便利数组A然后操作数组B

NSMutableArray * arrayTemp = xxx; 

    NSArray * array = [NSArray arrayWithArray: arrayTemp];  

    for (NSDictionary * dic in array) {        

        if (condition){            

            [arrayTemp removeObject:dic];

        }       

    }

方法二:

利用block来操作,根据查阅资料,发现block便利比for便利快20%左右,这个的原理是这样的:
找到符合的条件之后,暂停遍历,然后修改数组的内容

NSMutableArray *tempArray = [[NSMutableArray alloc]initWithObjects:@"12",@"23",@"34",@"45",@"56", nil];
    [tempArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        if ([obj isEqualToString:@"34"]) {
           *stop = YES;
            if (*stop == YES) {
                [tempArray replaceObjectAtIndex:idx withObject:@"3333333"];
            }
        }

        if (*stop) {
            NSLog(@"array is %@",tempArray);
        }
    }];



### NSInvalidArgumentException 原因分析 `NSInvalidArgumentException` 是一种常见的运行时异常,在 Objective-C 和 Swift 的 iOS 或 macOS 应用程序开发中经常遇到。当尝试调用某个方法或初始化器时传递了不合法的参数,就会抛出此异常。 对于 `__NSPlaceholderDictionary initWithObjects:forKeys:count:` 报错的情况,通常是因为传入了一个非法值(如 `nil`)。具体来说: - 当使用 `[NSDictionary dictionaryWithObjects:objects forKeys:keys count:count]` 初始化字典时,如果数组中的任何一个键或者值为 `nil`,都会触发 `NSInvalidArgumentException`[^1]。 #### 解决方案 为了避免此类错误发生,可以采取以下措施: 1. **验证输入数据**:在创建字典之前检查所有的键和值是否都有效且非空。 2. **过滤掉无效项**:可以通过循环或其他逻辑手段移除可能存在的 `nil` 键或值后再执行初始化操作。 以下是实现这些策略的一个例子代码片段: ```objective-c NSMutableArray *filteredKeys = [NSMutableArray array]; NSMutableArray *filteredValues = [NSMutableArray array]; for (int i=0;i<keyCount;i++) { id key = keys[i]; id obj = objects[i]; if(key && obj){ [filteredKeys addObject:key]; [filteredValues addObject:obj]; } } NSMutableDictionary *safeDict = [NSMutableDictionary dictionaryWithObjects:[filteredValues copy] forKeys:[filteredKeys copy]]; ``` 这段代码会先筛选掉任何可能导致崩溃的 `nil` 条目,从而安全地构建字典[^4]。 ### 进一步说明 除了上述提到的具体情况外,还有其他一些场景也可能引发类似的异常问题,比如试图访问不存在的对象属性或是调用了未定义的方法等。因此,在日常编码过程中保持良好的编程习惯非常重要——始终确认所使用的变量已被正确定义并赋初值;另外合理利用断言机制也可以帮助开发者尽早发现潜在隐患[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值