我有一个LoginViewController(UIViewController),当满足所有条件并且用户点击Login按钮时,会运行一个storyboard segue来推送ProfileViewController(UIViewController)。当发生这种情况时,我在我的LoginViewController的dealloc方法中有一个日志语句,看它是否被调用,令我失望的是它永远不会被调用。我的问题是它是否应该被称为?此外,当我登录时,有时我得到一个“收到的内存警告”,有时我不会觉得奇怪,因为我在两种情况下采取完全相同的步骤,但我得到一次内存警告而不是另一次
任何人都可以对此有所启发,这会很棒!
感谢。
答案 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实例不被释放的窗口。
如果你到目前为止有两个视图,那么内存警告应该来自其他地方。两种观点不会导致问题。