Метод Deinit вызывается автоматически, когда его экземпляр инициализирован, а делегат установлен на некоторый контроллер представления - PullRequest
1 голос
/ 16 октября 2019

Когда я инициализирую экземпляр ABCViewController, чтобы выдвинуть этот контроллер, как я это сделал здесь.

private func showABCController() {
      let storyBoard = UIStoryboard (
            name: "PaymentView", bundle: Bundle(for: ABCViewController.self)
        )
      var abcViewController =  storyBoard.instantiateViewController(withIdentifier: "ABCViewController") as! ABCViewController
      abcViewController.delegate = self
}

Метод denit контроллера представления вызывается сразу после того, как делегату присваивается значение self, даже до того, как я нажимаюконтроллер представления: -

//ABCViewController.swift
    import UIKit
    protocol ABCViewControllerDelegate : class{
        func backButtonPressed()
    }
    class ABCViewController: UIViewController {
        weak var delegate : ABCViewControllerDelegate?
        override func loadView() {
            super.loadView()
            print("loadView")
        }
        override func viewDidLoad() {
            super.viewDidLoad()

            // Do any additional setup after loading the view.
        }

        deinit {
            delegate?.backButtonPressed()
        }
        /*
        // MARK: - Navigation

        // In a storyboard-based application, you will often want to do a little preparation before navigation
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            // Get the new view controller using segue.destination.
            // Pass the selected object to the new view controller.
        }
        */

    }

Моя проблема, почему deinit называется? Здесь я заметил, что другие методы, такие как loadview и viewdidload не вызывается. Поэтому, прежде чем контроллер будет загружен в память, как его можно деинициализировать.

1 Ответ

0 голосов
/ 16 октября 2019

Вам нужно глубже понять, как работает ARC. В вашем случае вы потеряли ссылку на ваш ViewController строго после того, как метод showABCController () выполнил свою работу. Возможные решения:

  1. Выдвиньте свой VC из метода showABCController ()
  2. Сохраняйте сильную ссылку на abcViewController снаружи от метода и не забудьте освободить его после точного нажатия
...