繁体   English   中英

更改根视图控制器不会取消分配同一窗口上的先前视图控制器

[英]Changing the root view controller is not deallocating the previous view controllers on the same window

我的应用程序使用初始视图控制器启动(我们将其称为StartVC )。 现在,当用户按下继续按钮时,我将在StartVC之上呈现一个导航堆栈(我们将其称为RegisterVC )。 这个导航堆栈将包含5个视图控制器,当用户使用按钮操作向前移动时,我正在推动它。 在第5个视图控制器之后,我正在启动一个新的导航堆栈(我们将其称为LoginVC )。

现在我的用例是我不希望StartVCRegisterVC驻留在内存中,因为一旦用户完成注册它们就没用了。 为了实现这一点,我将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM