iPhone ui添加了求婚引起并发异常
-
19-09-2019 - |
题
这真的很奇怪...
我运行我的应用程序,并且在打开时,我会得到的视图正在构造:
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期间改变您的视图之一的属性的事情。
我碰到了同样的错误。我正在突变非序列线程的视图层次结构。确保在主线程上对视图进行所有修改。