was mutated while being enumerated

来源:互联网 发布:84cs域名升级访问升级 编辑:程序博客网 时间:2024/05/18 00:25

在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--;            }        }    }}
0 0
原创粉丝点击