iOS 使用enumerateObjectsUsingBlock遍历不全

2,615 阅读1分钟

在做项目需要遍历的数组的时候使用了这个 enumerateObjectsUsingBlock 关于这个方法的优缺点其他文章中记录了很多这里不再多赘述 记录蛋疼的一点是遍历不全比如当你需要遍历数组中删除某些元素时使用如下方法你会发现不好使

- (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;

这个方法是正序的会让两个连在一起的元素无法完全删除 可以使用下面这个方法

- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;

其中NSEnumerationOptions参数是个枚举值

NSEnumerationReverse是通过倒叙的方式来遍历。
NSEnumerationConcurrent表示枚举块是并发进行

小量的查询效率用forin优势更明显, 但是用forin在遍历的数组的时候同时对数组进行一些比如删除之类的操作就会报错

*** Terminating app due to uncaught exception ‘NSGenericException’, reason: ‘*** Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.’

网上的解决办法是

  NSMutableArray * arrayTemp = xxx; 
    NSArray * array = [NSArray arrayWithArray: arrayTemp];  
    for (NSDictionary * dic in array) {        
        if (condition){            
            [arrayTemp removeObject:dic];
        }       
    }

还有一个解决办法就是使用enumerateObjectsWithOptions具体怎么取舍看个人,