UIViewController在执行Push Segue时是否应该被释放

时间:2014-09-18 18:15:54

标签: ios memory-management uiviewcontroller automatic-ref-counting uistoryboardsegue

我有一个LoginViewController(UIViewController),当满足所有条件并且用户点击Login按钮时,会运行一个storyboard segue来推送ProfileViewController(UIViewController)。当发生这种情况时,我在我的LoginViewController的dealloc方法中有一个日志语句,看它是否被调用,令我失望的是它永远不会被调用。我的问题是它是否应该被称为?此外,当我登录时,有时我得到一个“收到的内存警告”,有时我不会觉得奇怪,因为我在两种情况下采取完全相同的步骤,但我得到一次内存警告而不是另一次

任何人都可以对此有所启发,这会很棒!

感谢。

2 个答案:

答案 0 :(得分:1)

UINavigationController维护一堆视图控制器。您从该堆栈上的一个元素LoginViewController开始。当您按下ProfileViewController时,您现在在堆栈上有两个元素。 LoginViewController在从堆栈中删除之前无法解除分配。

如果希望ProfileViewController替换导航控制器堆栈上的LoginViewController,则可以编写自定义segue类来实现该行为。 See this Q&A

(您可能认为可以在故事板中使用“替换”或“显示详细信息(例如替换)”segue类型,但这些仅在您使用UISplitViewController时有用。)

答案 1 :(得分:0)

启用ARC后,如果未引用对象,则会释放该对象。

为了显示来自ProfileViewController的视图,您可以在LoginViewController中实例化它的对象,这就是在呈现后仍然可以看到配置文件视图的方式。如果释放LoginViewController实例,则配置文件视图也将被释放(假设没有其他人引用它)。出于同样的原因,LoginViewController实例未被释放,因为另一个对象持有对它的引用。假设您的观点显示在Window - > ProfileViewController - > ProfileViewController,它是保持ProfileViewController实例不被释放的窗口。

如果你到目前为止有两个视图,那么内存警告应该来自其他地方。两种观点不会导致问题。