swift - 关闭 NSWindow 后 WKWebView 不回收
问题描述
我已经调用window.close()
了一个NSWindowController
. 我收到了窗口控制器的deinit
调用。但是与窗口关联的 NSViewController 没有回收。deinit
视图控制器的 没有被调用。
窗口控制器加载一个WKWebView
. 然后我在调用 close 之前将 html 内容设置为空。我已经为所有代表设置了 nil,deinit
并且代表都很弱。
活动监视器显示该Web Content
过程。
我有如下代码:
class WebKitViewController: NSViewController {
var webView: WKWebView?
private lazy var msgService: WebViewMessageService? = {
let s = WebViewMessageService()
s.delegate = self
return s
}()
weak var delegate: WebKitDelegate?
// ...
func initWebView() {
let webView = WKWebView(frame: CGRect.zero, configuration: self.initWebKitConfig())
webView.navigationDelegate = self
webView.uiDelegate = self
self.view.addSubview(webView)
// ...
}
}
如何回收内存并完全退出WindowController
with a WKWebView
based NSWindowController
?
中的关闭功能WebKitViewController
如下。
func closeWindow() {
DispatchQueue.main.async {
self.webView?.uiDelegate = nil
self.webView?.navigationDelegate = nil
self.msgService?.delegate = nil
self.webView?.removeFromSuperview()
if let window = self.view.window, let wc = window.windowController as? WebKitWindowController {
Log.debug("Closing window \(wc.windowId)")
self.webView?.loadHTMLString("", baseURL: nil)
self.delegate?.closeWindow(windowId: wc.windowId)
}
}
}
解决方案
这似乎是 WKScriptMessageHandler 的一个众所周知的错误。这是此链接的类似问题:Memory leak when using WKScriptMessageHandler
你可以做些什么来避免泄漏:
removeScriptMessageHandlerForName()
关闭窗口时调用。
推荐阅读
- java - 如何使用for循环循环二维数组?
- php - Laravel 5 日程安排问题 - php artisan schedule:run 有效,但实际日程安排无效
- javascript - expressJs 中的调试错误
- apache-spark - 使用 Spark 连接到 Greenplum 以读取数据时要使用的 jar 和驱动程序类是什么?
- sapui5 - 表的 getItems() 方法最多返回 20 行
- java - 如何以特定顺序关闭演员并能够在死前发送消息?
- amazon-web-services - Cloudformation 是否支持在 API Gateway 中使用代理集成选项?
- angular - 强制 FormControl 更改(无需用户干预)以使用 .distinctUntilChanged 触发 Observable 更改
- r - R:如何使用带有省略号的复制()...?
- gradle - 考虑到添加的文件,对输出目录的增量构建支持