美文网首页iOS点滴记录
for-in遍历数组时进行删除操作的几种方式

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

作者: henu_Larva | 来源:发表于2017-05-15 10:13 被阅读71次

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 ---

相关文章

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

    for-in 方式在遍历数据源开始时,数据源的个数就已经确定,在遍历时修改数据源并不会改变开始时确定下来的数据源个...

  • Swift 数组

    Swift 数组遍历的几种方式 1. for-in 不带索引 2. forEach 不能使用 break cont...

  • 基础语法

    遍历 js遍历 for-in注意JavaScript的for-in遍历,对于数组来说,x是下标(索引),不是数组元...

  • [Swift] Swift 中的遍历

    在 Swift 中实现循环/遍历有如下几种方式: 1.1 for-in 1.1.1 遍历区间 1.1.1.1 顺序...

  • GCD中dispatch_apply函数的使用方法

    当我们需要进行循环遍历时,例如遍历一个数组,我们一般会使用 For-In 循环,For-In 循环会从数组第一个元...

  • 遍历数组和字典

    快速遍历方法 遍历数组 For-in 遍历字典 enumerateKeysAndObjectsUsingBlo...

  • For-in

    用for-in去遍历容器时 NSArray 是按照数组的index顺序遍历 NSDictionary 是通过遍历字...

  • C语言函数指针与指针运算

    1.多级指针 2.数组与数组指针 3.采用指针遍历数组 4.循环时给数组赋值 5.数组指针操作的几种方式 6.指针...

  • 数组遍历自身的同时删除元素

    我们在遍历可变数组时,最好不要做删除数组中元素的操作。 因为删除操作可能会引起数组容量的变化,导致数组越界等问题。...

  • js中数组的遍历

    在平时的工作中,对数组,对象的遍历操作是非常常见的。现就遍历的几种方式做以下总结。 数组的遍历 假设有一个数组va...

网友评论

    本文标题:for-in遍历数组时进行删除操作的几种方式

    本文链接:https://www.haomeiwen.com/subject/btocxxtx.html