视图控制器在更改 rootViewController 时保留另一个



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

假设有两个视图控制器,每个视图控制器在 appDelegate 中调用一个函数,如下所示:

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

到目前为止,这运行良好 - 显示了另一个 VC,并且调用该函数的 VC 被解除分配。

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

然后从 ThirdVC 在 appDelegate 中调用上述函数(通过使其成为rootViewController来显示视图控制器一两个),这个 ThirdVC 和呈现它的 VC 不会被解除分配。

知道这是为什么吗?

如果需要,可以发布示例项目。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
})    
}

相关内容

  • 没有找到相关文章

最新更新