ARC在Apple的UI库中释放我的对象

时间:2015-03-20 17:53:03

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

我有一个局部变量UINavigationConroller *nav。声明后,在同一方法中,不会传递10行,而是传递给[self presentViewController:nav animated:YES completion:nil]selfUIViewController)。我知道在这里传递nil是正常的,因为the documentation says it is

在传递之前,一切都很好。然而,当它在那里时,ARC取消分配它,当Apple的UI库中的某些内容调用[UINavigationController isKindOfClass:]时,应用程序很快崩溃,可能是在我的nav对象上。这是控制台输出:

2015-03-20 13:33:50.729 Now[9183:3980870] Presenting view controllers on detached view controllers is discouraged <MyViewController: 0x125042200>.
2015-03-20 13:33:50.730 Now[9183:3980870] *** -[UINavigationController isKindOfClass:]: message sent to deallocated instance 0x12601c6e0

我已经进入,退出,通过这个课程和汇编代码几天,谷歌搜索尽可能多,似乎无法解决它。我唯一的解决方案是在[nav retain]之前拨打presentViewController,在之后立即拨打[nav release],但ARC禁止这样做。这是一个庞大的旧项目,所以我们不能关闭ARC。

如何在nav表格被使用之前取消分配?

更新


我使用Zombie分析器检查了这个。我发现它确实是UINavigationController,并且确实在UIKit中被解除分配:

A screenshot of the Zombie profiler

最有说服力的是前两行,显示它在分配时从960B开始,立即到0:

A screenshot of the top 2 frames in the Zombie proviler, hilighting the immediate nullification

我看起来很不典型,并为我抛出了红旗。

2 个答案:

答案 0 :(得分:0)

试试这个

[self.view.window.rootViewController presentViewController:navCon animated:YES completion:nil];

如果你因某种原因被释放,那么就不要依赖它。相反,取决于窗口的根控制器。

答案 1 :(得分:0)

这已经解决了。事实证明,当这个代码库首次编写时,它使用了一个&#34; stashing&#34;系统,它会在字段中保存任何模态UIViewController,然后将其解除。如果再次需要,它将呈现隐藏的模态和nil ify stash变量。

问题出在我如何处理事情,而不知道这个系统。在直接呈现或解雇模态时,我无意中设置了这个系统呈现僵尸UINavigationController的情况。使用此系统后,它按预期工作。