- //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, 是因为此时遍历已经结束, 结束之后对内容做修改是允许的 。
本文介绍了在Objective-C中使用NSMutableArray进行元素添加与移除时的安全做法,并对比了不同方法的效率,强调了避免遍历过程中直接修改数组的重要性。
1764

被折叠的 条评论
为什么被折叠?



