我的应用程序崩溃了设备控制台中的最后一条消息:
objc [5105]:无法形成类UIPageViewController的实例(0x10801ec00)的弱引用。该对象可能被过度释放,或者正在解除分配过程中。
随机应用也因相同的错误消息而崩溃,但UINavigationController
而不是UIPageViewController
。在模拟器和物理设备上可以重现错误(iOS 11.2.5)。
使用" Zombie"仪器中的模板没有提供任何有价值的信息。我发现过时的指南很有用: http://www.corbinstreehouse.com/blog/2007/10/instruments-on-leopard-how-to-debug-those-random-crashes-in-your-cocoa-app/
我的回答可能无法解决您的问题,但我希望它有助于跟踪它。此外,如果有人解释为什么ARC会在另一个主题上解雇,我会很感激。
答案 0 :(得分:0)
通过继承UIPageViewController
并在其中设置断点dealloc
,我发现它没有在主线程上执行。
不要在制作中执行此操作 - 仅在调试时使用
从主线程上的视图层次结构中同步删除其视图确实解决了问题。我没有视图控制器容器负责:
- (void)dealloc {
dispatch_sync(dispatch_get_main_queue(), ^{
[self.view removeFromSuperview];
});
}
然而,它甚至不是关于视图,而只是延迟执行足以修复崩溃,并且视图将与其超级视图一起清理。
- (void)dealloc {
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", self);
});
}
视图控制器存储在数组中,我知道当这个数组被销毁时,视图控制器也是如此。我检查了哪个线程对象保持对该数组的唯一一个引用被破坏,并且它是主线程。 ARC应该在删除对象的最后一个引用的同一线程上释放对象,但在我的应用程序中不是这种情况。 https://stackoverflow.com/a/32800112
我是如何解决我的问题的? 我不知道为什么会这样。当我发现在我手动删除对数组的引用时,在删除对其所有者的最后一个引用之前,该问题也将消失,我没有找到原因。