过度释放的对象 iOS 应用程序崩溃
Over-released object iOS app crash
我的应用崩溃并在设备控制台中显示最后一条消息:
objc[5105]: Cannot form weak reference to instance (0x10801ec00) of class UIPageViewController. It is possible that this object was over-released, or is in the process of deallocation.
Randomly 应用程序也崩溃并显示相同的错误消息,但 UINavigationController
而不是 UIPageViewController
。在模拟器和物理设备上可重现错误 (iOS 11.2.5)。
在 Instruments 中使用 "Zombie" 模板进行分析没有提供任何有价值的信息。我发现过时的指南很有用:
http://www.corbinstreehouse.com/blog/2007/10/instruments-on-leopard-how-to-debug-those-random-crashes-in-your-cocoa-app/
我的回答可能无法解决您的问题,但我希望它有助于跟踪它。此外,如果有人解释为什么 ARC 在不同的线程上触发,我将不胜感激。
通过继承 UIPageViewController
并在其中设置断点 dealloc
我发现它没有在主线程上执行。
不要在生产中这样做 - 只在调试时尝试
从主线程的视图层次结构中同步删除它的视图确实解决了这个问题。我没有对此负责的视图控制器容器:
- (void)dealloc {
dispatch_sync(dispatch_get_main_queue(), ^{
[self.view removeFromSuperview];
});
}
然而,它甚至与视图无关,而仅延迟执行就足以修复崩溃,视图将与其父视图一起被清理。
- (void)dealloc {
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", self);
});
}
视图控制器存储在数组中,我知道当这个数组被销毁时,视图控制器也是如此。我检查了哪个线程对象持有这个数组的唯一一个引用被销毁了,它是主线程。 ARC 应该在删除最后一个对象引用的同一线程上释放对象,但在我的应用程序中情况并非如此。
我是如何解决我的问题的:
我不明白为什么会这样。当我发现问题也会消失时,我不再寻找原因我手动删除对数组的引用,就在删除对其所有者的最后一个引用之前。
我的应用崩溃并在设备控制台中显示最后一条消息:
objc[5105]: Cannot form weak reference to instance (0x10801ec00) of class UIPageViewController. It is possible that this object was over-released, or is in the process of deallocation.
Randomly 应用程序也崩溃并显示相同的错误消息,但 UINavigationController
而不是 UIPageViewController
。在模拟器和物理设备上可重现错误 (iOS 11.2.5)。
在 Instruments 中使用 "Zombie" 模板进行分析没有提供任何有价值的信息。我发现过时的指南很有用: http://www.corbinstreehouse.com/blog/2007/10/instruments-on-leopard-how-to-debug-those-random-crashes-in-your-cocoa-app/
我的回答可能无法解决您的问题,但我希望它有助于跟踪它。此外,如果有人解释为什么 ARC 在不同的线程上触发,我将不胜感激。
通过继承 UIPageViewController
并在其中设置断点 dealloc
我发现它没有在主线程上执行。
不要在生产中这样做 - 只在调试时尝试
从主线程的视图层次结构中同步删除它的视图确实解决了这个问题。我没有对此负责的视图控制器容器:
- (void)dealloc {
dispatch_sync(dispatch_get_main_queue(), ^{
[self.view removeFromSuperview];
});
}
然而,它甚至与视图无关,而仅延迟执行就足以修复崩溃,视图将与其父视图一起被清理。
- (void)dealloc {
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", self);
});
}
视图控制器存储在数组中,我知道当这个数组被销毁时,视图控制器也是如此。我检查了哪个线程对象持有这个数组的唯一一个引用被销毁了,它是主线程。 ARC 应该在删除最后一个对象引用的同一线程上释放对象,但在我的应用程序中情况并非如此。
我是如何解决我的问题的: 我不明白为什么会这样。当我发现问题也会消失时,我不再寻找原因我手动删除对数组的引用,就在删除对其所有者的最后一个引用之前。