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
不会被调用。