【发布时间】: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)
// ...
}
}
如何回收内存并使用基于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)
}
}
}
【问题讨论】:
-
这是
s.delegate = self代表弱吗? -
您是否向 WebView 添加了一些观察者或处理程序?
-
@Asperi:是的,它是一个弱变量 (
weak var delegate: WebViewMessageServiceDelegate?)。 -
@AndrewVergunov:是的,我要添加
uiDelegate、navigatorDelegate和WKScriptMessageHandler。我在deinit中删除了前两个并将最后一个设置为nil,但deinit没有被调用。
标签: swift macos cocoa wkwebview