【学习ios之路:Object-C错误】Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.

错误提示:

产生错误的原因:

当程序在执行遍历时,同时又修改数组中的内容,导致崩溃.

解决方法如下:

方法1:定义一个一模一样的数组,遍历新数组的同时,对原数组进行操作修改.

例如:

NSMutableArray *arrayTemp = [@[@"aa",@"vv",@"bb"] mutableCopy];

NSArray *array = [NSArray arrayWithArray: arrayTemp];

for (NSString * str in array) {
   if (condition){
      [arrayTemp removeObject:str];
   }
}

方法2:

用到的是数组中一个扩展的方法enumerateObjectsUsingBlock,用到block块语法

- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts
      usingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop);

代码如下:

 //创建数组对象
NSMutableArray *array =[@[@"aa",@"cc",@"bb",@"dd"] mutableCopy];
 //调用这个方法
[array enumerateObjectsUsingBlock:
                    ^(id obj, NSUInteger idx, BOOL *stop) {
       //判断是否和自己要操作的元素是否相同,相同返回YES
      if ([obj isEqualToString:@"cc"]) {
         *stop = YES;

        if (*stop == YES) {//如果YES,进行删除,或者修改操作.
            [array replaceObjectAtIndex:idx withObject:@"ccc"];
            //[array removeObject:obj];
            }
        }
        if (*stop) { //操作成功.输出数组
             NSLog(@"%@",array);
            }
  }];
时间: 2024-10-10 08:18:55

【学习ios之路:Object-C错误】Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.的相关文章

解决Collection &lt;__NSArrayM: 0xb550c30&gt; was mutated while being enumerated

当程序出现这个提示的时候,是因为你一边便利数组,又同时修改这个数组里面的内容,导致崩溃,网上的方法如下: 1 2 3 4 5 6 7 8 9 NSMutableArray * arrayTemp = xxx; NSArray * array = [NSArray arrayWithArray: arrayTemp]; for (NSDictionary * dic in array) {    if (condition){       [arrayTemp removeObject:dic];

Bug-iOS: Collection &lt;__NSArrayM: 0x&gt; was mutated while being enumerated.

//init a NSArray NSMutableArray *arr2 = [NSMutableArray array]; for (int i=0; i<10; ++i) { NSMutableDictionary *d = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%d", i], @"a", nil]; [arr2 addObject:

【学习ios之路:Object-C】类与对象

1.面向对象和面向过程概念 1).面向过程 面向过程:以过程为核心,注重的是完成事件的详细步骤,一步一步如何实现. 2).面向对象 面向对象:以事物为核心,注重的是参与该事件的事物应该具备的功能.所以完成该事件只是事物所有功能中的一个功能. 2.类与对象 类: 类是具有相同特征以及行为的事物的抽象,它是一个抽象的概念,不具体. 对象: 类的实例.类的具体体现.生活中的万物都是对象. 3.OO与OOP OO:(Object Oritented)面向对象 OOP:(Object Oriented P

【学习ios之路:Object-C】字典.集合.

1.不可变数据字典(NSDicionary) 字典:用来存储具有一一对应关系的数据. 一个key 对应一个 value ,key起到了唯一标示的作用,key必须是唯一的,但是一个vlaue可以对应多个key. 字典存储的是无序的元素,一对键值对组成了字典中的一个元素. ①.不可变字典初始化赋值 <span style="font-size:18px;"> //笑笑语法 NSDictionary *dic = @{@"name":@"zhangd

【学习ios之路:UI系列】iOS沙盒机制,文件读取,归档与反归档

1.IOS中的沙盒机制 IOS中的沙盒机制是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 特点: 1.每个应用程序都在自己的沙盒内 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录.如下图

【学习ios之路:UI系列】实现轮播图效果(UIImageView,UIScrollView,UIPageControl,NSTimer相结合)

实现效果,在不点击的情况下,自定滚动,点击时,停止.如下图 部分代码如下: //调用NSTimer方法,自定计时 - (void)autoScroll { self.timer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self  selector:@selector(scrollToRight) userInfo:nil repeats:YES]; } //实现触发方法 - (void)scrollToRight { [UIVie

【学习ios之路:C语言】小程序:实现类似ATM取款机功能.

小程序:模拟ATM机取款的过程 1).定义两个能保存5个整形数的数组,一个用于保存5个人的卡号,一个用于保存对应卡号的密码 2).判断输入的卡号是否在数组中. 3).如果在数组中就让输入密码,判断是否和卡号对应的密码匹配. 4).判断密码,24小时内只允许输入3次错误的密码.输入错误应该提示还剩下的输入次数,3次都输入错误提示24小时内不允许操作该卡. 5).密码正确就让用户对该账户进行相应的操作. 6).注意取款的限制. 7).述功能对于一个ATM机是循环的过程,也就是说每个客户都会按照上面的

【学习ios之路:C语言】指针

指针 1.指针定义,即简单用法. <span style="font-size:14px;"> //指针变量:专门用来存储地址的变量. int *p = NULL;//NULL == 0 /** * 变量定义时: * (int *):指针类型 * p: 变量名 NULL:初始值. * NULL(指向了一个无效的区域) * *的作用: 告诉编译器,后面变量是指针变量,用来存储地址. * int作用: 1.当通过指针变量取数据时,一次性读取几个字节的数据. 2.当指针变量+1时

【学习ios之路:C语言】C语言中容易出错的试题整理.

注:此类题都是比较基础的试题,但是都容易让人忽视,或者平常不在意的. 1.表达式3.6-5/2+1.2+5%2的值是(D). A. 4.3  B. 4.8  C.3.3  D. 3.8 2.设有说明:char w;int x;float y;double z;则表达式w*x+z-y值的数据类型为:(D) A. float   B. char  C. int  D. double 3.以下关于运算符优先顺序的描述中正确的是:(C) A.关系运算符<算术运算符<赋值运算符<逻辑与运算符