NSMutableArray使用的范围非常广,一般在项目中获取数据后放进NSMutableArray中,或者在一些添加新对象或者插入数据的时候也会经常用到。
我们经常遇到的一个需求是,遍历一个数组,将数组里面的元素遍历,删除掉不符合规则的数据。这里面就有几点非常需要注意,这种属于自己删除自己,一不小心就会有crash出现。
比如有一个数组里面有4个元素,index分别是0,1,2,3,我们遍历的过程中,index = 0 的时候不符合,我们删掉了index = 0 的时候的数据,然后继续遍历 index = 3 的时候的数据也不对,这时候数组里面只有三个元素了,根本取不到index = 3的数据,造成数组越界,闪退。下面是具体的代码举例。
1. [mutableArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (obj不符合某条件) {
[mutableArr removeObject:obj];
}
}];
这种方式,删除一个元素时,正常。删除多个元素时,是异常的。(会出现索引跳位,即我们刚才说的情况)。
2. for(int i=0; i < [array count]; i++){
if(YES){
[array removeObjectAtIndex:i];
i--;
}
}
这种方式,也会出现索引对不上的问题,会出现crash。
3. while(array.count>0){
obj = [array objectAtIndex:0];
//判断处理
…
//remove
[array removeObjectAtIndex:0];
}
这种同2.
------------
最好还是把需要删除的内容,筛选出来放到一个NSMutableArray中,然后再把这些需要删除的统一从原始数组中删除:
NSMutableArray *discardedItems = [NSMutableArray array];
SomeObjectClass *item;
for (item in originalArrayOfItems) {
if ([item shouldBeDiscarded])
[discardedItems addObject:item];
}
[originalArrayOfItems removeObjectsInArray:discardedItems];
综上,上述方法是推荐的,最好的。