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) {
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];
}
}
[mArr removeObject:obj];
}
}];
//方法2.
NSArray *arr = [NSArray arrayWithArray:mArr];
for (NSMutableDictionary *dic in arr) {
if ([dic[@"a"] isEqualToString:@"3"]) {
[mArr removeObject:dic];
}
}