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

本文介绍如何正确地使用 Objective-C 中的 NSMutableArray 类进行元素的添加和删除操作,特别是避免在遍历过程中直接修改集合导致的程序崩溃问题,并提供两种安全的元素移除方法。

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

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];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值