Почему деинит не называется? - PullRequest
0 голосов
/ 10 октября 2019

Это мой код. Я не понимаю, почему не называется deinit.

class SplashVC: UIViewController {
    init() {
        super.init(nibName: nil, bundle: nil)
        print("SplashVC created")
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
            self?.navigationController?.popViewController(animated: false)
            self?.navigationController?.pushViewController(SignupViewController(), animated: true)
        }
    }
    deinit {
        print("SplashVC free")
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Ответы [ 3 ]

3 голосов
/ 10 октября 2019

Я прочитал документацию, и теперь я знаю, что моя проблема с контроллером представления root pop.

Этот метод удаляет контроллер вида сверху из стека и делает новую вершину стека активным представлением. контроллер. Если контроллер представления в верхней части стека является корневым контроллером представления, этот метод ничего не делает. Другими словами, вы не можете выбросить последний элемент в стек

3 голосов
/ 10 октября 2019

Вероятно, ваш SplashVC является корневым контроллером представления в вашем контроллере навигации. Если это действительно так, используйте вместо этого код:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) { [weak self] in
        self?.navigationController?.setViewControllers([SignupViewController()], animated: true)
    }
}
1 голос
/ 10 октября 2019

Метод deinit не вызывается, поскольку память, выделенная для SplashVC, не освобождается.

Вы просто нажимаете еще одну UIViewController на UINavigationController. UINavigationController по-прежнему хранит все контроллеры представлений, которые вы передали на него, следовательно, память, выделенная для каждого контроллера представлений, по-прежнему выделяется

. Вы использовали weak self в качестве меры, чтобы гарантировать, что нет утечки памяти или сохранитецикл, но метод deninit в этом случае будет вызываться только тогда, когда SplashVC извлечен из его UINavigationController. До тех пор, пока вы не откроете контроллер представления, выделенная память будет оставаться выделенной и недоступной для другого использования.

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