1

当我初始化 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 没有被调用。因此,在将控制器加载到内存之前,如何取消初始化。

4

1 回答 1

0

您需要更深入地了解 ARC 的工作原理。在您的情况下,您在 showABCController() 方法完成其工作后严格丢失了对 ViewController 的引用。可能的解决方案:

  1. 从 showABCController() 方法推送你的 VC
  2. 在方法之外保持对 abcViewController 的强引用,并且不要忘记在完全推送后释放它
于 2019-10-16T08:41:27.743 回答