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

ARC releases my object somewhere in Apple's UI library

我有一个局部变量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

几天来,我一直在介入、退出并通过这个 class 和汇编代码,尽可能多地进行谷歌搜索,但似乎无法修复它。我剩下的唯一解决方案是在 presentViewController 之前调用 [nav retain],然后立即调用 [nav release],但 ARC 禁止这样做。这是一个庞大的旧项目,因此 我们不能关闭 ARC。

如何让 nav 表单在使用完成之前被释放?

更新:


我已经使用 Zombie 分析器对此进行了检查。我发现它确实是一个 UINavigationController,并且确实在 UIKit:

中被释放

最能说明问题的是前两行,显示分配时从 960B 立即变为 0:

我这看起来很不正常,给我带来了危险信号。

试试这个

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

如果您反对出于某种原因被释放,请不要依赖它。相反,取决于 window 的根控制器。

已解决。事实证明,当这个代码库第一次被编写时,它使用了一个 "stashing" 系统,它将在一个字段中保存任何模态 UIViewController 然后将其关闭。当再次需要时,它会显示隐藏的模态并nil验证隐藏变量。

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