Контроллер не деиницируется после появления нового контроллера - PullRequest
0 голосов
/ 12 июня 2018

У меня есть FakeSplashController, который выполняет некоторые сетевые запросы и после этого открывает WelcomeViewController.Когда я смотрю график памяти в WelcomeViewController, я вижу, что SplashViewController все еще там.Я вызываю функцию deinit в FakeSplashController, чтобы проверить, является ли она денитирующей, но не вызывает ее.В чем может быть проблема?

Что я вижу в памяти, когда в WelcomeViewController: enter image description here

FakeSplashController:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    setupUI()
    networkRequests()

}

func networkRequests(){

    AppInitService().initAppRequest { [](result) in
        switch result{
        case .success(_):
            self.startAnimation()
            return
        case .error(let error):
            UIControlUtil.showErrorMessage(title: error.title, message: error.message, closeButton: true)
            return
        }
    }
}

func openApp(){
        let loginController = WelcomeViewController()
    self.present(loginController, animated: true)
}

func startAnimation(){
    UIView.animate(withDuration: 0.8, animations: {
        self.logoImage.frame.origin.x -= 100
    }, completion: nil)
    UIView.animate(withDuration: 1,delay: 0.3,animations: {
        self.textLogo.alpha = 1
        self.textLogo.frame.origin.x += 50
    }, completion: { _ in
        self.openApp()
    })
}

deinit {
    print("Splash Deinited")
}

РЕДАКТИРОВАТЬ: Как я читал в следующем посте, кто-то упомянул это;

Если вы не делаете что-то очень специализированное, вам не нужно деинициализировать объект в Swift.Он будет вызван автоматически, когда счетчик ссылок станет равным 0. Если вам действительно нужно, вы сможете установить rootViewController вашего окна через AppDelegate.

Так что мне не нужно это делатькак проблема? Лучший способ деинитировать начальный вид контроллера?

1 Ответ

0 голосов
/ 12 июня 2018

Как я сказал в комментарии, в вашем коде нет ничего странного, это то, как работает iOS Framework;контроллер представления не освобожден, потому что он все еще rootViewController текущего окна.Я не думаю, что это очень необходимо, чтобы освободить его, но если вам действительно нужно это сделать, решением может быть замена rootViewController на WelcomeViewController.При замене счетчик ссылок на заставке изменится на 0, и он будет освобожден.Что-то вроде

guard let window = UIApplication.shared.keyWindow else {
    return
}
self.dismiss(animated: false, completion: nil)
window.rootViewController = WelcomeViewController()

Проблема в том, что нет анимации (но вы также можете добиться анимации, просто найдите, как анимировать rootViewController change)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...