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