gpt4 book ai didi

swift - 关闭 NSWindow 后 WKWebView 不回收

转载 作者:行者123 更新时间:2023-12-03 17:08:55 26 4
gpt4 key购买 nike

我在 NSWindowController 上调用了 window.close()。我收到窗口 Controller deinit 调用。但与窗口关联的 NSViewController 并未回收。 View Controller 的 deinit 没有被调用。

窗口 Controller 加载一个WKWebView。然后,我在调用 close 之前将 html 内容设置为空。我在 deinit 中为所有委托(delegate)设置了 nil,并且委托(delegate)都很弱。

事件监视器显示Web Content 进程。

Web Content Process

我有这样的代码:

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

最佳答案

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

如何避免泄漏:

关闭窗口时调用removeScriptMessageHandlerForName()

关于swift - 关闭 NSWindow 后 WKWebView 不回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59152235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com