1

我已经在这几天了,几天前问了这个问题。我认为最好更清楚地重新表述这个问题。

我在 UINavigationController 中有一系列 UICollectionViewController。每次用户进行选择时,屏幕上都会推送一个新的集合视图,该集合视图负责从 API 获取其内容。

有时此时会发生崩溃。每次的例外情况都不同。通常,它是以下之一:

*** Collection <NSConcreteMapTable: 0x1922cf60> was mutated while being enumerated.

或者

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSSetM: 0x203f26b0> was mutated while being enumerated.'

有时它甚至不会抛出异常,但程序会在“空线程”中暂停error: address doesn't contain a section that points to a section in a object file。最后,当一个项目被选中,新的视图被按下,然后当它出现时快速按下后退按钮时,这个错误更一致地重现。但它也可能在没有按下后退按钮的情况下发生。

我附加了我自己的未捕获异常处理程序以打印出堆栈跟踪。在所有情况下,我自己的课程都没有在跟踪中。

我设置了“异常中断”,但它永远不会在任何有意义的地方停止——通常是一些仅读取trap或在 UIApplicationMain 中的不起眼的汇编代码。

所以我的问题是:我什至从哪里开始调试呢?

如果有帮助,我可以发布一个堆栈跟踪的示例。

4

1 回答 1

0

首先,在 Xcode 中设置异常断点。它会在抛出异常之前停止,所以你知道是谁造成的。

似乎正在发生的是你有代码

for (id object in somearray) ...

当该循环运行时,有人修改了 somearray。那是致命的。您可能必须考虑如何编写代码。例如,您可以只写

for (id object in [somearray copy]) ...

然后你可以随心所欲地修改 somearray 。也许您的代码不是线程安全的,并且另一个线程在一个线程迭代它时修改了 somearray。

于 2015-05-14T20:15:42.783 回答