背景:今天使用enumerateObjectsUsingBlock删除数组里面的对象元素出现删除不全的问题。
[indexSceneList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"obj===>%@",obj);
NSLog(@"idx===>%lu",(unsigned long)idx);
SceneItem *customIndexSceneItem = obj;
NSLog(@"customIndexSceneItem.uid=>%@",customIndexSceneItem.uid);
for (SceneItem *item in defaultSceneList) {
NSLog(@"item.uid==>%@==>%@",item.uid,customIndexSceneItem.uid);
if ([item.uid isEqualToString:customIndexSceneItem.uid]) {
[indexSceneList removeObject:customIndexSceneItem];
}
}
}];
原因:当发现符合删除条件的时候将该元素从数组里删除,这是数组里的元素会向前移动,各个元素的下标会-1,但是遍历过程是按idx递增的,所以下一个获取的元素是跳过了一个下标的元素,也就是删除一个再遍历获取到的元素实际上是原始数组跳过一个下标的元素。简而言之,就是删除一个元素以后数组元素位置前移,但是我们遍历的元素的索引又向后加,就刚好完美错过。
解决方案:倒叙删除
for (NSInteger i = [indexSceneList count] - 1; i >= 0; i--) {
SceneItem *customIndexSceneItem = [indexSceneList objectAtIndex:i];
for (SceneItem *item in defaultSceneList) {
NSLog(@"item.uid==>%@==>%@",item.uid,customIndexSceneItem.uid);
if ([item.uid isEqualToString:customIndexSceneItem.uid]) {
[indexSceneList removeObjectAtIndex:i];
}
}
}
网友评论