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

Nav*_*een 8 xcode ios swift

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

现在,我的用例是我不希望StartVCRegisterVC驻留在内存中,因为一旦用户完成注册,它们就没有用了。为了实现此目的,我将AppDelegate窗口的根视图控制器更改为LoginVC。

以下是我在RegisterVC的第五个视图控制器上尝试过的选项:

1)更改键盘窗口

    UIApplication.shared.keyWindow?.rootViewController = LoginVC
    UIApplication.shared.keyWindow?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)

2)变更视窗

   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   appDelegate.window?.rootViewController = LoginVC
   appDelegate.window?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)

3)在分配新的根视图控制器之前,将其作为零。

   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   appDelegate.window?.rootViewController = nil
   appDelegate.window?.rootViewController = LoginVC
   appDelegate.window?.makeKeyAndVisible()
Run Code Online (Sandbox Code Playgroud)

4)我也直接从AppDelegate尝试了上述选项,而不是从第5个视图控制器进行尝试。

使用以上所有选项,我尝试通过在所有视图控制器上查看deinit来进行调试,但是没有一个被释放。另外,我可以在xcode Debug View Hierarchy中看到LoginVC下的第5个视图控制器。

因为没有从内存中删除它们,所以我面临的实际问题是在显示LoginVC之后,我有一个背景色alpha较小的视图控制器。因此,我看到了其下方的RegisterVC 5th视图控制器。

任何对此的帮助表示赞赏...

Lou*_*nco 5

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

有很多方法可能会意外地执行此操作(在块中捕获对 self 的强引用,而不是将委托或其他反向引用标记为弱引用等)。

你也许可以用 Instruments 来解决这个问题。这是一个教程:http : //samwize.com/2016/05/30/finding-retain-cycle-with-instruments/