首页 > 解决方案 > 关闭 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)
        // ...
    }
}

如何回收内存并完全退出WindowControllerwith a WKWebViewbased 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)
        }
    }
}

标签: swiftmacoscocoawkwebview

解决方案


这似乎是 WKScriptMessageHandler 的一个众所周知的错误。这是此链接的类似问题:Memory leak when using WKScriptMessageHandler

你可以做些什么来避免泄漏:

removeScriptMessageHandlerForName()关闭窗口时调用。


推荐阅读