was mutated while being enumerated

在oc中会出现这种情况,当时不知道怎么回事,就一直查代码,因为以前写的就没有问题,为什么这次就出现问题了。

- (void)deleteContactsForName:(NSString *)name{
    for (NSString * groupName in _contactDic) {
        NSMutableArray * oneGroup =[_contactDic objectForKey:groupName];

        for (Contact * c  in oneGroup) {
            if ([[c name ] isEqualToString:@"陈达"]) {
                [oneGroup removeObject:c];

            }
        }
    }

}

其错误的显示如下

这里写图片描述

主要是因为在遍历数组的时候,又改变了数组。另一方面是因为forin叫做快速遍历,问什么快速呢?因为forin开启了多线程,在多线程下,不能同时改变数组,又同时遍历数组。那么单线程呢,单线程是可以的,所以在这种情况下,没有没得方法,只能用普通的for循环了。当然你要是学过多线程的话,可以用线程锁来防止这种情况。这次,就不演示使用线程锁了,只演示一下普通for循环来解决此方法。

直接上代码

// 根据姓名删除联系人
- (void)deleteContactsForName:(NSString *)name{


    for (NSString * string in _contactDic) {

        NSMutableArray * oneGroup =[_contactDic objectForKey:string];

        int n = (int)[oneGroup count];
        for (int i = 0; i < n; i++) {
            if ([[oneGroup[i] name]isEqualToString:name]) {
                [oneGroup removeObjectAtIndex:i];
                i--;
                n--;
            }
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值