swift - 关闭 NSWindow 后 WKWebView 不回收

标签 swift macos cocoa wkwebview

我在 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/

相关文章:

cocoa - iOS 7 : Restrict device current orientation when modal view controller is presented

xcode - Swift 中的延迟操作

macos - 使用 OpenCL 1.2 模拟 OpenCL 1.1

xcode - 验证 Xcode 安装时出现 "/Applications/Xcode.app: a sealed resource is missing or invalid"错误

swift - NSBitmapImageRep 上的 setColor 在 Swift 中不起作用

objective-c - NSFileWrapper 的 serializedRepresentation 返回不适当的大数据

ios - 如何读取 iOS 项目中 Realm 变量的值?

swift - 类型 ???没有成员

ios - 无法让属性字符串在 Swift 中工作

ios - 如何调试 ios8 共享扩展?