[英]Changing the root view controller is not deallocating the previous view controllers on the same window
我的应用程序使用初始视图控制器启动(我们将其称为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第五视图控制器。
任何有关这方面的帮助...
我认为rootViewController设置不是问题。 也许您在其他视图控制器中有一个保留周期,可以阻止它们被释放。
有很多方法你可能会意外地做到这一点(在块中捕获对self的强引用,而不是将委托或其他后引用标记为弱等)。
您可以用仪器来解决这个问题。 这是一个教程: http : //samwize.com/2016/05/30/finding-retain-cycle-with-instruments/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.