forin 循環(huán)中的遍歷內(nèi)容不能被改變, 是因?yàn)槿绻淖兤浔憷膬?nèi)容會少一個, 而系統(tǒng)是不會允許這個發(fā)生的所以就會crash...但是當(dāng)改變最后一個的內(nèi)容時, 就不會crash, 是因?yàn)榇藭r遍歷已經(jīng)結(jié)束, 結(jié)束之后對內(nèi)容做修改是允許的
//init a NSArray
NSMutableArray *arr2 = [NSMutableArray array];
for (int i=0; i<10; ++i) {
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%d", i], @"a", nil nil];
[arr2 addObject:d];
}
//Wrong
for (NSMutableDictionary *s in arr2) {
if ([s[@"a"] isEqualToString:@"3"]) {
[arr2 removeObject:s]; //while here is safe for s[@"a"] = @"eeee";
}
}
//Safe 1.
[arr2 enumerateObjectsUsingBlock:^(NSMutableDictionary *obj, NSUInteger idx, BOOLBOOL *stop) {
if ([obj[@"a"] isEqualToString:@"3"]) {
*stop = YES;
[arr2 removeObject:obj]; // or obj[@"a"] = @"4ewewewe";
}
}];
//Safe 2.
NSArray *tmp = [NSArray arrayWithArray:arr2];
for (NSMutableDictionary *s in tmp) {
if ([s[@"a"] isEqualToString:@"3"]) {
s[@"a"] = @"eeee";
[arr2 removeObject:s];
}
}