过度发布的对象iOS应用程序崩溃

时间:2018-02-12 14:59:13

标签: ios objective-c crash automatic-ref-counting

我的应用程序崩溃了设备控制台中的最后一条消息:

  

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会在另一个主题上解雇,我会很感激。

1 个答案:

答案 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

我是如何解决我的问题的? 我不知道为什么会这样。当我发现在我手动删除对数组的引用时,在删除对其所有者的最后一个引用之前,该问题也将消失,我没有找到原因。