这真的很奇怪...

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

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中访问它时可能会被修改的内容,那么我可以更轻松地调试此问题。也许在添加某些内容时,它与在视图中添加一些东西有关吗?有任何想法吗?

有帮助吗?

解决方案

这不是并发例外。当某物(可能在同一线程中的循环中)更改循环正在迭代的数组/set/词典时,就会发生枚举突变异常。

由于AddSubView:在堆栈上,我的猜测是,在构造过程中,有些东西试图删除Uiview的一个子视图。

您是否覆盖可能正在运行的任何方法?像addSubView或可能的LayoutsUbViews?如果其中任何一个正在删除子视图,则会引起问题。

其他提示

您的视图是否有可能有一个子层,您将代表分配为视图?通常,这会导致视图无限地恢复(好吧,直到列出堆栈极限) _makeSubtreePerformSelector:withObject:withObject:copySublayers:, ,但我想在这里尝试做的任何事情都可能涉及突变。

之所以如此,是因为Uiview假设如果Calayer的代表是Uiview,那么Calayer属于Uiview,并且Uiview是层次结构的一部分。但是,如果您创建自己的Calayer并将代表分配为Uiview,则Uiview最终将自称为递归的一部分。

从文档中:

枚举是“安全的” - 枚举者有一个突变守卫,因此如果您试图在枚举过程中修改收集,则会提出例外。

基本上,这意味着您在使用Objective-C 2.0中引入的快速枚举进行枚举时,不允许您将对象添加到集合(例如数组)。因为这样做会使突变后卫无效。

就您而言,该集合与视图层次结构有关。如果要添加和/或删除此特定集合的视图,请不要使用快速枚举。

当您尝试在Calayer的-dealloc方法中清除属性时,我已经看到这发生在Calayers中,只是无意间更改该属性会改变图层的可见属性。您可以检查并查看您是否正在做一些在同一视图的-Dealloc期间改变您的视图之一的属性的事情。

我碰到了同样的错误。我正在突变非序列线程的视图层次结构。确保在主线程上对视图进行所有修改。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top