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

时间:2017-07-16 15:00:09

标签: ios swift xcode

我的应用程序启动时使用初始视图控制器(我们将其称为 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 第五视图控制器。

对此有任何帮助... ...

1 个答案:

答案 0 :(得分:4)

我认为rootViewController设置不是问题。也许您在其他视图控制器中有一个保留周期,可以阻止它们被解除分配。

有很多方法可以不小心做到这一点(在块中捕获对self的强引用,而不是将委托或其他后引用标记为弱等)。

您可以通过乐器了解它。这是一个教程:http://samwize.com/2016/05/30/finding-retain-cycle-with-instruments/