3

这真的很奇怪……

我运行我的应用程序,当它打开并且正在构建视图时,我得到:

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

代码跟踪通过以下方式:

main
UIApplicationMain
-[UIApplication _run]
CFRunLoopRunInMode
CFRunLoopRunSpecific
_UIApplicationHandleEvent
-[UIApplication sendEvent:]
-[UIApplication handleEvent:withNewEvent:]
-[UIApplication _runWithURL:sourceBundleID:]
-[UIApplication _performInitilizationWithURL:sourceBundleID:]
-[AppDelegate applicationDidFinishLaunching:]
+[Controller initializeController] //This is my own function
    [window addSubview: pauseMenuController.view] //This is the last point of my code it goes through
-[UIView(Hierarchy) addSubview:]
-[UIView(Internal) _addSubview:positioned:relativeTo:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
_NSFastEnumerationMutationHandler
objc_exception_throw

我已经运行了很多很多次游戏,但我从未见过这个,然后它突然出现了。奇怪的是,在所有代码都被调用之前,我没有创建任何其他线程(我知道) 。如果有人可以解释一下在 UIView 中访问它时可能会被修改的内容,那么我调试它会更容易。它是否与在视图中添加一些东西有关,而它已经添加了一些东西,也许?有任何想法吗?

4

5 回答 5

17

您的视图是否可能有一个子层,您将委托分配为视图?这通常会导致视图在调用时无限递归(嗯,直到它达到堆栈限制)_makeSubtreePerformSelector:withObject:withObject:copySublayers:,但我想它在这里尝试做的任何事情都可能涉及突变。

之所以如此,是因为 UIView 假设如果 CALayer 的委托是 UIView,那么 CALayer 属于 UIView,而 UIView 是层次结构的一部分。但是,如果您创建自己的 CALayer 并将委托分配给 UIView,则 UIView 最终将作为递归的一部分调用自身。

于 2009-11-10T22:50:01.230 回答
4

这不是并发异常。当某些东西(可能在同一线程中的循环内)更改循环正在迭代的数组/集合/字典时,会发生枚举突变异常。

由于 addSubview: 在堆栈上,我的猜测是在构建过程中某些东西试图删除 UIView 的子视图之一。

您是否覆盖了任何可能正在运行的方法?像 addSubview 或可能的 layoutSubviews?如果其中任何一个正在删除子视图,那么这将导致问题。

于 2009-11-11T07:34:30.850 回答
0

从文档中:

枚举是“安全的”——枚举器有一个突变保护,因此如果您在枚举期间尝试修改集合,则会引发异常。

基本上,这意味着当您使用 Objective-C 2.0 中引入的快速枚举来枚举它时,不允许您向集合(例如数组)添加/删除对象。因为这样做会使突变保护无效。

在您的情况下,该集合与视图层次结构相关。如果要向此特定集合添加和/或删除视图,请不要使用快速枚举。

于 2009-11-10T22:53:36.173 回答
0

当您尝试在 CALayer 的 -dealloc 方法期间清除属性时,我已经看到在 CALayers 中发生这种情况,只是更改该属性会无意中改变图层的可见属性。您可以检查并查看您是否以某种方式在同一视图的 -dealloc 期间以某种方式更改了您的一个视图的属性。

于 2009-11-11T04:10:53.090 回答
0

我遇到了同样的错误。我在非主线程上改变了视图层次结构。确保对视图的所有修改都在主线程上执行。

于 2010-03-09T01:20:09.523 回答