目前,我发现了一个反复出现的错误:
2013-04-18 02:35:51.583 aaah[1713:1110f] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x1fc00dc0> was mutated while being enumerated.'
在失败的后台队列中(我通过按下Command + 5看到崩溃时我的队列状态),我看到:
0 _pthread_kill
1 pthread_kill
我看到装配输出,我完全不明白。
我知道如何解决这种数组枚举错误 - 我无法理解在哪里/如何寻找导致我的应用程序崩溃的代码段。
我有很多使用AFNetworking和Core Data的多线程代码,所以我不能只记得关键部分的位置。
此外,此错误并非总是发生,但有时会发生,因此很难仅使用“隔离方法”,隔离较小和较小的代码片段,以最终识别错误的代码片段。
所以问题是:
如何从此输出中提取更多有用的信息,或者Xcode可以为我提供更多详细程度,因此我可以知道如何解决这段令人讨厌的代码。
答案 0 :(得分:2)
您是否尝试过设置例外断点?有时调试器会在块内部处理异常处理,但它可能有所帮助。
在断点导航器(窗口左侧的其中一个选项卡)中,单击窗口底部的加号按钮,然后选择添加例外断点。然后点击完成。
现在当你崩溃时,调试器应该希望在异常提出之前就把你放好。
修改强>
根据评论中提供的反馈,这里有更多分析:
您的应用程序引发的异常意味着您试图在枚举块内部更改集合类型(在本例中为NSMutableOrderedSet
)(在您的情况下,很可能是for循环)。看起来您正在尝试删除正在循环的集合中的对象:[NSMutableOrderedSet removeObjectsInRange:inOrderedSet:]
要解决此问题,您应该存储要删除的范围,然后在不再迭代该集合时执行实际删除。它仍然很难,因为据我所知,你并没有打破Objective-C代码。您应该查看左侧面板中正在运行的线程,并查看它们当前所处的方法。这可能会为您提供有关代码错误位置的提示。