奔溃日志:was mutated while being enumerated

这两天发现app的一个崩溃,提示是

*** Collection <CALayerArray: 0x18904630> was mutated while being enumerated.

找了一天终于找到了罪魁祸首,代码是这样的

for (NSInteger i = 0; i < postArr.count; i++) {

for (NSInteger j = i+1; j < postArr.count; j++) {

MoviePhoto *mp = postArr[i];

MoviePhoto *secMp =postArr[j];

if ([mp.photoUrl.value isEqualToString:secMp.photoUrl.value]) {

[postArr removeObject:mp];//删除重复对象

}

}

}

原因是这样的,for循环在编译的时候可能就不会改变被遍历数组的数据,当进入if语句数组进行remove了之后,再去遍历数组,发现被遍历数组和编译的时候不一样。此时就会造成崩溃。

在使用数组的时候,我们应该避免遍历数组时不要对数组进行操作。但是对于我们有时候要使用到对用一个数组进行遍历又要进行修改的时候,网上提供了两种方法:

1遍历数组A操作数组B;

NSMutableArray * arrayTemp = xxx;

NSArray * array = [NSArray arrayWithArray: arrayTemp];

for (NSDictionary * dic in array) {

   if (condition){

      [arrayTemp removeObject:dic];

   }

}

2.找到符合的条件之后,暂停遍历,然后修改数组的内容

NSMutableArray *tempArray = [[NSMutableArray alloc]initWithObjects:@"12",@"23",@"34",@"45",@"56"nil];

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

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

*stop = YES;

if (*stop == YES) {

[tempArray replaceObjectAtIndex:idx withObject:@"3333333"];

}

}

if (*stop) {

NSLog(@"array is %@",tempArray);

}

}];

PS:利用block来操作,根据查阅资料,发现block便利比for便利快20%左右;

如果都不是数组遍历的原因,有可能是线程的原因。这里贴上了网上的一些资料:

遇到一个问题,跟踪了半天才发现原因。(现象是,客户老是说在下载的过程中,过一会就出现崩溃的现象, 只要点了下载按钮, 不做任何操作, 然后期刊就开始正常下载了,过大概5分钟后,再去看,程序就已经崩溃了)

在做《时装传媒》ipad应用时,首页的下载页面,下载时,会不断地去更新页面上的下载进度,同时还有一个15秒的timer, 会每15秒切换当前显示的是男装,女装或者艺术刊页面。这个timer会把当前的scrollView中显示的封面图片进行移除,然后再替换,以实现自动更换首页封面的功能

因为我们在下载时, 使用了Block每当接受到数据,就去更新一下一个UIScrollView中的下载进度条的百分比。

而另有一个NSTimer, 会隔一段时间把这个UIScrollView中的全部元素清空,然后再重新添加, 因为可能有动态的元素需要添加或者删除。

运行时, 就会出现,两个线程同时去访问的情况, 当Block正在去更新UIScrollView中的这个元素时, NSTimer中可能正在执行清除操作,所以就崩了。

原来,在同一时间,不同的线程同时读取和修改了NSMutaleArray。

解决办法:避免多线程同时去修改一个对象, 避免做遍历时,这个对象被修改,根据这个思想,可以考虑加锁,或者直接使用atomic的方式来做。

时间: 2024-10-25 18:02:10

奔溃日志:was mutated while being enumerated的相关文章

android app记录运行日志 捕获奔溃异常 ,存储日志到文件

app在运行过程中,为了后期的维护升级,记录日志是一个非常好的方法. 为了读取到app运行时的日志,一般的作法是单独开一个线程,在app运行的启动线程,然后app退出时停掉线程. 然而我们更好的方法是开启一个service,然后在里面做日志记录,代码如下: package com.hai.logcat; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.i

undo回滚异常导致实例奔溃,无法正常open

接到地市反馈某一个数据库打不开了 1.登陆主机,查看数据库告警日志 最早数据库出现问题时的日志是在2014年6月7日 数据库在切换redo时异常关闭,之后数据库一直为开启使用 2.数据库在2014年6月8日 OPEN后,有recovery的进程报错 目前已经找不到这些文件,无法核实当时的异常信息源,接着往下看日志 3.数据库在2014年6月9日11:36:45时又异常关闭 4.同样的现象出现在2014年8月11日13:26:07,数据库异常关闭 5.数据库在2014年8月11日13:18:46再

window server 2008 远程桌面间歇性奔溃

服务器远程桌面间歇性不能连接报告 一.描述: 2014-08-1216:12分左右,web服务器(192.168.0.80)出现间歇性不能连接问题.而处于同一局域网内的其它服务器能通过远程桌面连接.2分钟后,服务器可以通过远程桌面可以连接.通过其它服务器再远程上去看,发现网卡流量很大. 查看事件查看器,得到在该时刻,两个Application Error.如下图: 二.错误的详细信息为: 日志名称:         Application 来源:           Application Er

slave断电,mysql主从奔溃恢复从服务至正常

本想连照片一起上传的,这样更直观:很遗憾照片无法上传,但是也无法阻止我发文!!! slave上操作: [[email protected] mysql]# tail slave.err 160121 21:44:43 [Note] Event Scheduler: Purging the queue. 0 events 160121 21:44:43 [Note] Error reading relay log event: slave SQL thread was killed 160121

误打误撞写了段能让电脑奔溃的JS代码,但是自己不知道为什么,高手看到可以解答下吗?

代码如下: <script> for(i=1;j=3*i;i++){ for(;j<=50;){ document.write(j+"<br>") } } </script> 保存下,看以后自己多学点能不能知道是为什么,是不是进入死循环了?但是最后怎么会让电脑奔溃了呢?

注意!神秘DNS漏洞现身 可致服务器奔溃

近日,互联网系统协会ISC发布紧急补丁修复隐藏在开源软件BIND中的严重安全漏洞.该安全漏洞编号为CVE-2015-5477,能够允许远程.未经认证的攻击者使用BIND发送特殊的命令,导致DNS服务器奔溃. 通过这个漏洞,一名黑客可以在一次行动中造成一片网络区域不正常.但是,当多名黑客同时行动的时候,就会导致足够多的DNS服务器出现奔溃,从而对于互联网带来非常严重的宕机和其他延伸影响. 那么这一漏洞跟普通用户有什么关系呢?域名服务器保存了网络中主机的域名和对应ip地址,并将域名转换为ip地址,也

见鬼?粉碎移动硬盘数据导致两年Windows8.1奔溃了!

一.这两天可谓闹心,吐槽一下: 本来最近很忙,不小心用了近两年的windows8.1系统奔溃了,很伤心,因为我粉碎了我移动硬盘的数据.前两天我的移动硬盘借给了公司同事,同事备份一些东西,之后过了几天,数据没用了,我就说删除了,但是删除了一部分,一些文件夹和文件始终删除不了,用电脑管家强制粉碎,确实删除了一部分,但是说一些东西要重启生效(当时自然而然重启了,没多想,现在挺郁闷的,理论不需要),然后,然后,就没有然后了,系统奔溃了.因为处理过程比较久,就不截图了. 二.大致流程: 2.1)移动硬盘数

iOS之UI--错误、奔溃、bug集合

1.循环利用cell的ID设置位置写错了.导致程序奔溃. 2.对于除数算法,可以直接算出结果的就写上结果,不要偷懒写式子让计算机自己算,更何况是除数,可能会算出无限小数的可能性.

Win10桌面奔溃怎么办?雨林木风Win10奔溃解决方法教程

Win10用户量一大,问题就如潮水般涌来.最严重的问题就是桌面奔溃,导致电脑无法正常使用.小编也找了很多方法,终于被小编成功突破了,现在来带给大家分享一下如何解决Win10系统桌面奔溃问题. 推荐雨林木风Win10装机版系统:http://www.ylmf10.com/win10zhuangji/ 造成这一系列原因是因为诺顿杀毒及其他杀毒软件.iCloud以及IDT Audio等软件原因,大家可以进入Win10安全模式来卸载这些软件解决Win10桌面奔溃. 进入安全模式的方法: 按Win+R打开