更改 rootViewController 时查看控制器保留另一个

View controller retaining another when changing rootViewController

我在执行以下操作的应用程序中发现内存泄漏:

想象两个视图控制器,每个视图控制器都调用 appDelegate 中的一个函数,类似于:

func switchRootViewController() {    
    let vc = getTheOtherViewController()
    self.window?.rootViewController = vc
}

目前为止一切正常 - 显示了另一个 VC 并释放了调用该函数的那个​​。

但是当您通过以下方式从第一个或第二个 VC 呈现第三个视图控制器时: present(ThirdViewController(), animated: true)

然后从ThirdVC调用appDelegate中的上述函数(通过使rootViewController显示viewController一或二),这个ThirdVC并且呈现它的 VC 不会被释放。

知道这是为什么吗?

如果需要,可以 post 示例项目。 VC 是从情节提要中实例化的,如果有任何区别的话。

你在这里搞乱了视图层次结构。在切换到新视图控制器之前,您应该关闭当前 rootViewController 的所有呈现的视图控制器。这是我发现唯一有效的解决方案!

您的 switchRootViewController 方法应该如下所示,

func switchRootViewController() {    
   if var topController = UIApplication.shared.keyWindow?.rootViewController {
        while let presentedViewController = topController.presentedViewController {
            topController = presentedViewController
        }
        topController.dismiss(animated: true, completion: {
            let vc = getTheOtherViewController()
            self.window?.rootViewController = vc
        })
    }
}

如果你有多个视图控制器,

func switchRootViewController() {   
   self.view.window!.rootViewController?.dismiss(animated: true, completion: {
      let vc = getTheOtherViewController()
      self.window?.rootViewController = vc
   })    
}