for-in遍历数组时进行删除操作的几种方式

for-in 方式在遍历数据源开始时,数据源的个数就已经确定,在遍历时修改数据源并不会改变开始时确定下来的数据源个数.所以在for-in 循环内删除数据源数据经常会造成程序 crash. 下面是总结的一些遍历删除数据源数据的几种方式:

NSMutableArray *origArr = [NSMutableArray arrayWithObjects:@"1",@"5",@"6",
                                                           @"1",@"2",@"8",
                                                           @"1",@"5",@"7",
                                                           nil];

先来看一下错误的方式:
报错原因:*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x100400e10> was mutated while being enumerated.'

for (NSString *str in origArr) {
            if ([str isEqualToString:@"1"]) {
                [origArr removeObject:str];
            }
        }

下面是几种可行方案:

//方式一:采用 for循环
        for (int i = 0; i < origArr.count; i++) {
            NSString *str = [origArr objectAtIndex:i];
            if ([str isEqualToString:@"1"]) {
                [origArr removeObject:str];
            }
        }
//方式二:采用 for-in, 添加 break 语句
        for (NSString *str in origArr) {
            if ([str isEqualToString:@"1"]) {
                [origArr removeObject:str];
                break;
            }
        }
//方式三:新建一个副本数据源,遍历副本数据源,然后在原数据源内删除数据
        NSMutableArray *copyArr = [NSMutableArray arrayWithArray:origArr];
        for (NSString *str in copyArr) {
            if ([str isEqualToString:@"1"]) {
                //在原数据源内删除数据
                [origArr removeObject:str];
            }
        }
//方式四:逆序遍历,然后删除数据
        NSEnumerator *enumeretor = [origArr reverseObjectEnumerator];
        for (NSString *str in enumeretor) {
            if ([str isEqualToString:@"1"]) {
                [origArr removeObject:str];
            }
        }

--- END ---

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容