NSView没有被释放

时间:2019-03-18 16:23:37

标签: swift macos cocoa delegation nsviewcontroller

我这里的情况很奇怪,这几乎可以肯定是因为我是macOS开发的新手,而且我缺少一些核心知识。

我有一个模式表,正在以编程方式显示。 (我没有使用情节提要segue,因为它必须是验证的结果,到目前为止,我还没有找到以编程方式启动segue的方法-如果有人有建议,这是一个子问题)

这是我的做法:

searchVC = NSStoryboard(name: "Main", bundle: nil).instantiateController(withIdentifier: "SearchSceneIdentifier") as? SearchViewController
    if searchVC != nil {
        searchVC!.searchTerm = searchTextField.stringValue
        self.presentAsSheet(searchVC!)
    }

这很好地展示了工作表,并让我与之互动。在其中,我使用的是一个具有委托的类,以便返回异步搜索查询。

这很奇怪,是我打电话的时候

self.view.window!.close()

从视图控制器内部,我认为视图控制器没有被释放。这似乎是因为委托仍然连接到它,即使具有该委托的对象在视图控制器本身的范围之内。该委托似乎正在将视图控制器保存在内存中。

在关闭窗口之前,我已经通过以下方法解决了这个问题:

search.delegate = nil

但是对于其他具有相同问题的视图控制器来说,这不是一个好的解决方案,因为它们位于窗口内,并且我不想捕获窗口关闭然后向每个窗口发送某种通知以使nil-确定他们的代表。

另一种似乎也是错误的方法是,我在应用程序委托中保留对这些窗口的引用,并从那里将其零化。

所有这些似乎都可以解决释放问题,我希望有一种更清洁的方法可以解决此问题。在Objective-C中,引用计数始终是一个问题,但是有一些模式可以很干净地处理它们。

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

我将所有代表都更新为weak var,这已经解决了我所有与分配有关的问题。