gpt4 book ai didi

ios - 过度释放对象 iOS 应用程序崩溃

转载 作者:行者123 更新时间:2023-12-02 06:01:00 25 4
gpt4 key购买 nike

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

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.

随机应用程序也崩溃并显示相同的错误消息,但 UINavigationController 而不是 UIPageViewController。该错误可在模拟器和物理设备上重现 (iOS 11.2.5)。

在 Instruments 中使用“Zombie”模板进行分析没有提供任何有值(value)的信息。我发现过时的指南很有用: http://www.corbinstreehouse.com/blog/2007/10/instruments-on-leopard-how-to-debug-those-random-crashes-in-your-cocoa-app/

<小时/>

我的回答可能无法解决您的问题,但我希望它有助于跟踪它。此外,如果有人解释为什么 ARC 在不同的线程上触发,我将不胜感激。

最佳答案

通过子类化UIPageViewController并在其dealloc中设置断点,我发现它没有在主线程上执行。

不要在生产中这样做 - 仅在调试时使用

从主线程的 View 层次结构中同步删除其 View 确实解决了该问题。我没有 View Controller 容器负责:

- (void)dealloc {
dispatch_sync(dispatch_get_main_queue(), ^{
[self.view removeFromSuperview];
});
}

然而,这甚至与 View 无关,而仅仅延迟执行就足以修复崩溃,并且 View 将与其 super View 一起被清理。

- (void)dealloc {
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@", self);
});
}

View Controller 存储在数组中,我知道当这个数组被销毁时, View Controller 也会被销毁。我检查了哪个线程对象持有对此数组的唯一一个引用被销毁,它是主线程。 ARC 应该在删除最后一个对象引用的同一线程上释放对象,但在我的应用程序中情况并非如此。 https://stackoverflow.com/a/32800112

<小时/>

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

关于ios - 过度释放对象 iOS 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48749308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com