2

在“deinit”方法中没有命中断点时存在主题。解决方案是将可执行代码放入其中。试过了 - 没有用。

ViewController从第一个窗口启动的代码:

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

它会打开一个带有按钮的新窗口,该按钮在单击时调用以下代码

    dismissViewController(self)

这是带断点的 deinit 代码。

初始化代码

该方案中未启用僵尸对象。

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

有什么办法可以确保对象被销毁?

4

2 回答 2

1

Apple 用于关闭控制器的文档使用presentViewControllerAsModalWindow()“要关闭模式窗口,请在自身(呈现视图控制器)上调用dismissViewController(_:) 方法”的状态。因此,您可能会从呈现的控制器本身中解散呈现的控制器。从呈现视图控制器调用驳回会有所帮助。

于 2017-05-12T10:45:32.143 回答
0

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

你在尝试什么?当你点击解雇时,它不是在调用 deinit 方法吗?

// 主视图控制器

@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")
    }
}
于 2017-05-08T12:18:08.043 回答