过度释放的对象 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 应该在删除最后一个对象引用的同一线程上释放对象,但在我的应用程序中情况并非如此。


我是如何解决我的问题的: 我不明白为什么会这样。当我发现问题也会消失时,我不再寻找原因我手动删除对数组的引用,就在删除对其所有者的最后一个引用之前。