【发布时间】:2017-12-21 03:36:22
【问题描述】:
我的应用程序使用初始视图控制器启动(我们将其称为 StartVC)。现在,当用户按下继续按钮时,我将在 StartVC 之上显示一个导航堆栈(我们将其称为 RegisterVC)。此导航堆栈将包含 5 个视图控制器,每当用户使用按钮操作向前移动时,我都会将其推向它。在第 5 个视图控制器之后,我开始了一个新的导航堆栈(我们将其称为 LoginVC)。
现在我的用例是 我不希望 StartVC 和 RegisterVC 驻留在内存中,因为一旦用户完成注册,它们就没有用了。为了实现这一点,我将 AppDelegate 窗口的根视图控制器更改为 LoginVC
以下是我在 RegisterVC 的第 5 个视图控制器上尝试的选项:
1) 更改按键窗口
UIApplication.shared.keyWindow?.rootViewController = LoginVC
UIApplication.shared.keyWindow?.makeKeyAndVisible()
2) 改变窗口
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = LoginVC
appDelegate.window?.makeKeyAndVisible()
3) 在分配新的根视图控制器之前,将之前的根视图控制器设为 nil。
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController = nil
appDelegate.window?.rootViewController = LoginVC
appDelegate.window?.makeKeyAndVisible()
4) 我还直接从 AppDelegate 尝试了上述选项,而不是从第 5 个视图控制器进行。
使用上述所有选项,我尝试通过查看所有视图控制器上的 deinit 进行调试,但没有一个被释放。此外,我可以在 xcode 调试视图层次结构中看到 LoginVC 下的第 5 个视图控制器。
由于没有将它们从内存中删除,我面临的实际问题是在呈现 LoginVC 之后,我有一个背景颜色 alpha 较小的视图控制器。因此,我在其下方看到了 RegisterVC 第 5 个视图控制器。
对此的任何帮助表示赞赏...
【问题讨论】:
-
我建议使用"debug memory graph" 功能来看看是什么保持对那些旧视图控制器的强引用。
-
你应该在这里回答:stackoverflow.com/a/27153956/849645。如果你的问题和我的一样,这已经为我解决了。