我有一个局部变量UINavigationConroller *nav
。声明后,在同一方法中,不会传递10行,而是传递给[self presentViewController:nav animated:YES completion:nil]
(self
是UIViewController
)。我知道在这里传递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中被解除分配:
最有说服力的是前两行,显示它在分配时从960B开始,立即到0:
我看起来很不典型,并为我抛出了红旗。
答案 0 :(得分:0)
试试这个
[self.view.window.rootViewController presentViewController:navCon animated:YES completion:nil];
如果你因某种原因被释放,那么就不要依赖它。相反,取决于窗口的根控制器。
答案 1 :(得分:0)
这已经解决了。事实证明,当这个代码库首次编写时,它使用了一个&#34; stashing&#34;系统,它会在字段中保存任何模态UIViewController
,然后将其解除。如果再次需要,它将呈现隐藏的模态和nil
ify stash变量。
问题出在我如何处理事情,而不知道这个系统。在直接呈现或解雇模态时,我无意中设置了这个系统呈现僵尸UINavigationController
的情况。使用此系统后,它按预期工作。