NSView未被释放

问题描述 投票:0回答:1

我在这里有一个奇怪的情况几乎可以肯定,因为我是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-ify。

所有这些似乎都是解除分配问题的令人讨厌的解决方案,我希望有一种更清洁的方法来做到这一点。在Objective-C中,引用计数始终是一个问题,但有一些模式可以干净地处理它们。

任何建议表示赞赏

swift macos cocoa delegation nsviewcontroller
1个回答
0
投票

我将所有代表更新到weak var,这解决了我释放的所有问题。

© www.soinside.com 2019 - 2024. All rights reserved.