Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 关闭NSW窗口后,WKWebView未回收_Swift_Macos_Cocoa_Wkwebview - Fatal编程技术网

Swift 关闭NSW窗口后,WKWebView未回收

Swift 关闭NSW窗口后,WKWebView未回收,swift,macos,cocoa,wkwebview,Swift,Macos,Cocoa,Wkwebview,我在NSWindowController上调用了window.close()。我接到窗口控制器的电话。但与窗口关联的NSViewController未回收。未调用视图控制器的deinit 窗口控制器加载WKWebView。然后在调用close之前,我将html内容设置为空。我在deinit中为所有委托设置了nil,并且委托都很弱 活动监视器显示Web内容过程 我有如下代码: class WebKitViewController: NSViewController { var webVi

我在
NSWindowController
上调用了
window.close()
。我接到窗口控制器的电话。但与窗口关联的NSViewController未回收。未调用视图控制器的
deinit

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

活动监视器显示
Web内容
过程

我有如下代码:

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)
        // ...
    }
}
如何使用基于
WKWebView
NSWindowController
回收内存并完全退出
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的一个众所周知的错误。下面是这个链接提出的类似问题:

如何避免泄漏:


关闭窗口时调用
removeScriptMessageHandlerForName()

这是
s.delegate=self
delegate弱吗?是否向WebView添加了一些观察者或处理程序?@Asperi:是的,这是一个弱变量(
弱变量委托:WebViewMessageServiceDelegate?
)。@AndrewVergunov:是,我正在添加
uiDelegate
navigatorDelegate
WKScriptMessageHandler
。我正在删除前两个,并在
deinit
中将最后一个设置为nil,但是
deinit
不会被调用。