1

目前,我看到一个反复出现的错误:

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 可以为我提供一些更详细的级别,所以我可以知道如何解决这段烦人的代码。

4

1 回答 1

2

您是否尝试过设置异常断点?有时调试器在块内处理异常时会遇到困难,但它可能会有所帮助。

在断点导航器(窗口左侧的选项卡之一)中,单击窗口底部的加号按钮并选择添加异常断点。然后点击完成。

现在,当您崩溃时,调试器应该有望在引发异常的那一刻之前将您置于正确位置。

有关更多信息,请参阅http://developer.apple.com/library/mac/#recipes/xcode_help-breakpoint_navigator/articles/adding_an_exception_breakpoint.html

编辑:

根据评论中提供的反馈,这里有一些更多的分析:

您的应用程序引发的异常意味着您尝试更改NSMutableOrderedSet枚举块(在您的情况下,很可能是 for 循环)内的集合类型(在本例中为 )。看起来您正在尝试删除正在循环的集合中的对象:[NSMutableOrderedSet removeObjectsInRange:inOrderedSet:]

要解决此问题,您应该存储要删除的范围,然后在不再迭代该集合后进行实际删除。这仍然会很困难,因为据我了解,您不会破坏 Objective-C 代码的内部。您应该查看左侧面板中正在运行的线程,并查看它们当前使用的方法。这可能会提示您代码错误的位置。

于 2013-04-18T00:27:45.357 回答