OSX 关闭视图控制器后未调用 deinit

OSX deinit is not being called after dismissing view controller

在"deinit"方法中没有命中断点时存在主题。解决方案是在里面放一个可执行代码。试过了 - 没用。

从第一个 window 开始 ViewController 的代码:

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

它会打开一个新的 window,其中包含一个按钮,该按钮在单击

时会调用以下代码
    dismissViewController(self)

这是带有断点的 deinit 代码。

计划中未启用僵尸对象。

如果在弹出窗口再次出现时重新使用 viewcontroller,那不会有问题,但是每次都会创建视图控制器的新实例。

是否有任何事情可以确保对象被销毁?

只是尝试按照您在每个 viewController 中用于按钮的相同代码复制此代码并成功击中断点,并将 var num 从 0 (viewDidLoad) 更改为 1,然后在 deInit 中更改为 0 :

你在尝试什么?当你点击dismiss的时候,不是在调用deinit方法吗?

//主要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")
    }
}

Apple 的关闭控制器的文档使用 presentViewControllerAsModalWindow() 表示 "To dismiss the modal window, call the dismissViewController(_:) method on self (the presenting view controller)."。因此,您可能会从呈现的控制器本身中解雇呈现的控制器。从呈现视图控制器调用 dismiss 会有所帮助。