我已经在这几天了,几天前问this question。我认为更清楚地重新解释这个问题可能更好。
我在UINavigationController中有一系列UICollectionViewControllers。每次用户进行选择时,都会在屏幕上推送新的集合视图,此集合视图负责从API获取其内容。
有时此时发生了崩溃。例外情况每次都不同。通常,它是以下之一:
*** Collection <NSConcreteMapTable: 0x1922cf60> was mutated while being enumerated.
OR
*** 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的非描述汇编代码。
所以我的问题是:我在哪里开始调试?
如果它有帮助,我可以发布一个堆栈跟踪的例子。
答案 0 :(得分:0)
首先,在Xcode中设置一个异常断点。在抛出异常之前它将停止,因此您知道是谁造成的。
似乎正在发生的是你有代码
for (id object in somearray) ...
当该循环正在运行时,有人会修改某个阵列。这是致命的。您可能需要考虑如何编写代码。例如,你可以写
for([somearray copy]中的id对象)...
然后您可以根据需要修改某个阵列。也许你的代码不是线程安全的,而另一个线程在一个线程迭代它时修改了一些线程。