Контроллер представления сохраняет другой при изменении rootViewController
Я обнаружил утечку памяти в приложении, где делается следующее:
Представьте себе два контроллера представления, каждый из которых вызывает функцию в appDelegate, подобную этой:
func switchRootViewController() {
let vc = getTheOtherViewController()
self.window?.rootViewController = vc
}
Пока это работает хорошо - другой VC показан, и тот, который вызвал функцию, освобожден.
Но когда вы представляете третий контроллер вида из первого или второго VC через:present(ThirdViewController(), animated: true)
А затем вызовите вышеуказанную функцию в appDelegate из ThirdVC (чтобы показать viewController один или два, сделав его rootViewController
), этот ThirdVC и VC, представивший его, не освобождаются.
Есть идеи, почему это так?
При необходимости можете опубликовать пример проекта. VC создаются из раскадровки, если это имеет значение.
1 ответ
Вы портите иерархию представлений здесь. Вы должны отклонить все представленные контроллеры текущего 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
})
}