我的应用程序启动时使用初始视图控制器(我们将其称为 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 Debug View Hierarchy中看到 LoginVC 下的第5个视图控制器。
由于没有将它们从内存中删除,我面临的实际问题是在呈现 LoginVC 后,我有一个背景颜色alpha较小的视图控制器。因此,我看到了 RegisterVC 第五视图控制器。
对此有任何帮助... ...
答案 0 :(得分:4)
我认为rootViewController设置不是问题。也许您在其他视图控制器中有一个保留周期,可以阻止它们被解除分配。
有很多方法可以不小心做到这一点(在块中捕获对self的强引用,而不是将委托或其他后引用标记为弱等)。
您可以通过乐器了解它。这是一个教程:http://samwize.com/2016/05/30/finding-retain-cycle-with-instruments/