我在应用程序中发现了内存泄漏,其中执行以下操作:
假设有两个视图控制器,每个视图控制器在 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
})
}