- //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];
- }
- }
利用block來操作,根據查閱資料,發現block便利比for便利快20%左右,這個的原理是這樣的:
找到符合的條件之後,暫停遍歷,然後修改數組的內容
PS: 搜一句補充的話
//forin 循環中的便利內容不能被改變, 是因爲如果改變其便利的內容會少一個, 而系統是不會允許這個發生的所以就會crash...但是當改變最後一個的內容時, 就不會crash, 是因爲此時遍歷已經結束, 結束之後對內容做修改是允許的 。