我这里的情况很奇怪,这几乎可以肯定是因为我是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中,引用计数始终是一个问题,但是有一些模式可以很干净地处理它们。
任何建议表示赞赏。
答案 0 :(得分:0)
我将所有代表都更新为weak var
,这已经解决了我所有与分配有关的问题。