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