【问题标题】:WKWebView is not reclaiming after closing the NSWindow关闭 NSWindow 后 WKWebView 不回收
【发布时间】:2019-12-03 07:40:08
【问题描述】:

我已通过NSWindowController 致电window.close()。我正在接到窗口控制器deinit 的电话。但是与窗口关联的 NSViewController 没有回收。视图控制器的deinit 没有被调用。

窗口控制器加载一个WKWebView。然后我在调用 close 之前将 html 内容设置为空。我已经为deinit 中的所有代表设置了 nil,并且代表都很弱。

活动监视器显示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)
        // ...
    }
}

如何回收内存并使用基于WKWebViewNSWindowController 完全退出WindowController


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)
        }
    }
}

【问题讨论】:

  • 这是s.delegate = self代表弱吗?
  • 您是否向 WebView 添加了一些观察者或处理程序?
  • @Asperi:是的,它是一个弱变量 (weak var delegate: WebViewMessageServiceDelegate?)。
  • @AndrewVergunov:是的,我要添加uiDelegatenavigatorDelegateWKScriptMessageHandler。我在deinit 中删除了前两个并将最后一个设置为nil,但deinit 没有被调用。

标签: swift macos cocoa wkwebview


【解决方案1】:

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

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

关闭窗口时致电removeScriptMessageHandlerForName()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多