关于数组在遍历过程中修改问题

问题描述:当我们需要通过遍历数组过滤的时候,一般会考虑以下写法,这种写法 会引起crash

*** Collection <__NSArrayM: 0x7fddedfca720> was mutated while being enumerated.

 1 NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithObjects:@"1",@"1",@"2",@"1",@"1",@"1",@"1",@"1",@"1",@"1", nil];
 2
 3     for (NSString *numStr in mutableArray) {
 4
 5         if ([numStr isEqualToString:@"2"]) {
 6
 7             [mutableArray removeObject:numStr];
 8
 9         }
10
11     }

问题解决:可以使用 方法

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block NS_AVAILABLE(10_6, 4_0);

来避免这个crash

[mutableArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        if ([obj isEqualToString:@"2"]) {

            [mutableArray removeObject:obj];

        }

    }];

还可以拷贝一份数组来操作如:

1 NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithObjects:@"1",@"1",@"2",@"1",@"1",@"1",@"1",@"1",@"1",@"1", nil];
2     NSArray *array = [NSArray arrayWithArray:mutableArray];
3     for (NSString *numStr in array) {
4         if ([numStr isEqualToString:@"2"]) {
5             [mutableArray removeObject:mutableArray];
6         }
7     }
时间: 2024-11-08 05:11:20

关于数组在遍历过程中修改问题的相关文章

ResultSet遍历过程中修改自身数据,不会改变循环的过程

ResultSet遍历过程中修改自身数据,不会改变循环的过程: import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class TestTbl { public static void main(String[] args) throws Exception { Connection tXdConn = Conn.getTXdConn(); String

字典遍历过程中修改字典元素,报错 RuntimeError: dictionary changed size during iteration

https://blog.csdn.net/u013344884/article/details/81867225 原文地址:https://www.cnblogs.com/come202011/p/12432224.html

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译. foreach (int x in myArray) { x++; //错误代码,因为改变了元素的值 Console.WriteLine(x); } 如果要让自定义的数据类型支持foreach循环,则该类型必须实现IEnumerable<T>接口,且存在对应此列表的IEnumerator<T>实现. 实际上,在.Net的底层(IL语言层面)而言, foreach (var

C++数组在内存中的分配

接前一篇的内容,C++中数组在内存中也有静态分配和动态分配的区别.静态数组建立的方式为:A a[],它在栈上分配空间;动态方式是使用new,malloc在堆上分配. 数组要么在静态存储区被创建(如全局数组),要么在栈或堆上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变.看下例: 1 #include<iostream> 2 using namespace std; 3 void test() 4 { 5 char ch[]="hel

HANA Studio中修改默认查询结果只显示1000行

成员变量 //由该流的创建者提供的 byte 数组. protected byte buf[]; //要从输入流缓冲区中读取的下一个字符的索引. protected int pos; //流中当前的标记位置. protected int mark = 0; //比输入流缓冲区中最后一个有效字符的索引大一的索引. protected int count; 构造参数 提供一个byte数组 public ByteArrayInputStream(byte buf[]) { this.buf = buf

继承HttpServletRequestWrapper以实现在Filter中修改HttpServletRequest的参数

一 简介 如题所示,有时候我们需要在一个请求到达Controller之前能够截获其请求,并且根据其具体情况对 HttpServletRequest 中的参数进行过滤或者修改.这时,有的同学可能会想:我们是否可以在一个Filter中将 HttpServletRequest 里的所有参数都取出来分别进行过滤然后再放回到该HttpServletRequest 中呢? 很显然,在 HttpServletRequest 貌似只有 setAttribute(String name, Object o) 这个

Swift数组的存取与修改

1 对数组的存取与修改可以通过数组的方法和属性来进行,或者使用数组的下标语法. 2 3 要知道数组中元素的数量,可以查看它的只读属性count: 4 println("The shopping list contains \(shoppingList.count) items.") 5 // 输出“The shopping list contains 2 items.” 6 使用Boolean型的isEmpty属性,可以快速检查count属性是否为0: 7 if shoppingLis

windows 7中修改用户配置文件的路径

在windows 7中用户配置文件的默认位置是在c:\users文件夹中.我建议最好在安装完操作系统之后就将用户配置文件的默认位置改变到其他分区. Warning在视图更改注册表之前,请备份好注册表相关键值. 1. 将c:\user文件夹Copy到新的位置(默认情况下 "Default" directory 是隐藏的,请到 Tools > Folder Options > View (tab) > Show Hidden files, folders, and dri

在Exchange 2013 OWA登录页面中修改密码

透过OWA登录界面改密码对于使用Exchange的用户来说是一个很有有用的功能. 因为如果用户不在公司域环境中,当密码已经到期登录不了OWA,就没有办法通过OWA中的[选项]来改密码,当开启这项功能后,管理员和用户都可以很方便的处理密码到期的case. 早在Exchange2010的时候,我们需要通过修改CAS服务器的注册表项来实现这个功能.现在的Exchange2013已经内置了该功能,使用前只需要确认该功能属性的状态就可以了. 在最新的Exchange2013 SP1和CU5版本中,此功能在