更改 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
})
}
我在执行以下操作的应用程序中发现内存泄漏:
想象两个视图控制器,每个视图控制器都调用 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
})
}