美文网首页
iOS for in 快速遍历的时候 找到满足条件的元素删除

iOS for in 快速遍历的时候 找到满足条件的元素删除

作者: 画舫烟中浅 | 来源:发表于2020-11-03 20:05 被阅读0次

for in 遍历 崩溃:

            for (CataloguizeModel * sortModel in self.gameListArray) {
                    if (sortModel.is_last_play_blind == 1) {
                    CataloguizeModel *newModel = [[CataloguizeModel alloc] init];
                    newModel = sortModel;
                    [self.gameListArray removeObject:sortModel];
                    [self.gameListArray insertObject:newModel atIndex:0];
                  }
            }

崩溃原因:

        <_NSArrayM : >was mutated while being enumerated

解决方法:

 [self.gameListArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                CataloguizeModel * sortModel = [[CataloguizeModel alloc] init];
                sortModel = obj;
                if (sortModel.is_last_play_blind == 1) {
                    *stop = YES;
                    if (*stop == YES) {
                        [self.gameListArray removeObject:obj];
                        [self.gameListArray insertObject:sortModel atIndex:0];
                    }
              }
    }];

原因分析:
可能是数组越界,因为for in 快速遍历 array.count 不会改变。当我们正序快速遍历时,如果删除了一个,那么没有遍历到的元素位置都会往前移动一位,这样系统就无法确定接下来遍历是从删除位置开始呢,还是从删除位置下一位开始呢?这样就造成程序crash了。比如数组有5个元素,删除了一个。正常情况下,array.count == 4 ,但是for in 快速遍历的结果是 array.count == 5 ,所以导致数据越界。造成Crash。

网上找到其它的解决办法:
1:使用for循环遍历。因为i < array.count,这个判断条件中,当数组元素个数变化时,array.count也在变,就不会出现数组越界的情况
2.逆序遍历 。因为逆序遍历时,遇到匹配的元素删除后,位置改变的是遍历过得元素,而没有遍历到的元素位置却没有改变,所以遍历能够正常进行

相关文章

  • iOS for in 快速遍历的时候 找到满足条件的元素删除

    for in 遍历 崩溃: 崩溃原因: 解决方法: 原因分析:可能是数组越界,因为for in 快速遍历 arra...

  • Java 高性能遍历 Map 的三种方式

    常规遍历,能满足大部分场景 按需遍历,更高性能 Iterator 遍历,过程可删除元素

  • iOS 常用的数据处理

    1. iOS遍历数组的同时删除元素 NSMutableArray*array = [NSMutableArraya...

  • 83. Remove Duplicates from Sorte

    没什么好说的,就是直接遍历,找到符合条件的删除

  • Java删除List中的元素

    for循环遍历删除 使用for遍历删除的问题在于删除某元素后,List的大小变化了,会导致遍历时漏掉某些元素,例如...

  • js 数组操作

    遍历删除元素: 遍历数组:for循环遍历: forEach遍历:

  • golang slice 遍历删除

    在slice中遍历删除满足条件的项如下示例为,在一个数字切片中,遍历删除6以下的,保留6以上的数字 输出 afte...

  • 迭代器模式

    java集合类遍历有个常见的问题就是想在Iterator里面去判断删除某个符合条件的元素的时候,如果使用List....

  • 数组查询的几种方法

    find()//获取数组中满足条件的第一个元素,该方法对于空数组不会执行,当找到满足条件的元素时//返回该元素,且...

  • js常用数组API

    数组api forEach 遍历数组的所有元素 every 用来判断所有的数组元素,都满足一个条件 some 用来...

网友评论

      本文标题:iOS for in 快速遍历的时候 找到满足条件的元素删除

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