Контроллер представления сохраняет другой при изменении 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
   })    
}
Другие вопросы по тегам