OSX deinit не вызывается после закрытия контроллера представления

Были темы, когда точка останова не была достигнута методом "deinit". Решение состояло в том, чтобы поместить исполняемый код внутри. Попробовал это - не сработало.

Код для инициирования ViewController из первого окна:

    let vc = self.storyboard?.instantiateController(withIdentifier: "testwindow") as! NSViewController
    self.presentViewControllerAsModalWindow(vc)

Это открывает новое окно с кнопкой, которая вызывает следующий код при нажатии

    dismissViewController(self)

и вот код deinit с точками останова.

код деинита

объекты зомби не включены в схему.

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

Что-нибудь нужно сделать, чтобы объект был уничтожен?

2 ответа

Решение

Документация Apple по увольнению контроллера, представленная с помощью presentViewControllerAsModalWindow() заявляет, что "Чтобы закрыть модальное окно, вызовите метод dismissViewController(_:) для self (контроллер представления представления).". Таким образом, вы можете исключить представленный контроллер из представленного контроллера. Вызов увольнения из контроллера представления представления поможет.

Просто попытался повторить это, следуя тому же коду, который вы использовали с кнопкой в ​​каждом viewController, и успешно нажал breakPoints, а также изменил значение переменной с 0 (viewDidLoad) на 1 и обратно на 0 в deInit:

Что вы пытаетесь сделать? Когда вы нажимаете "Отменить", разве это не вызывает метод deinit?

// Main ViewController

@IBAction func letsGo(_ sender: UIButton) {
        if let vc = storyboard?.instantiateViewController(withIdentifier: "second") as? SecondViewController {
            self.present(vc, animated: true, completion: nil)
        }
    }

// Второй вид контроллера

class SecondViewController: UIViewController {

    var num = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        num += 1
        print("\(num)")
    }

    @IBAction func dismissTheHype(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }

    deinit {
        print("deiniting")

        num -= 1
        doNothing()
        print("printing number \(num)")
    }

    func doNothing(){
        var number = 4
        number += 1
        print("\(number) times")
    }
}
Другие вопросы по тегам