最近做的項目有webview和js交互的,查了些資料之后,也很容易入手。但是后期優化才發現,webview的delloc方法一直就沒被調用過。意識到問題的嚴重性之后,開始了各種分析。最后定位到的問題代碼如下。
[configuration.userContentController addScriptMessageHandler:self name:@"onScan"];
如果使用wkwebview,添加了js的ScriptMessageHandler,那么就會出現循環引用。自己嘗試去解決這個問題。用了幾個常規方法都不起作用。
第一:
使用弱引用,通過weakself控制器,失敗。
第二:
通過自定義WKScriptMessageHandler代理。親測可行,但是代理類不被釋放。失敗。
第三:
override func viewWillAppear(_ animated: Bool) {
webView.configuration.userContentController.add(self, name: "onError")
}
override func viewWillDisappear(_ animated: Bool) {
webView.configuration.userContentController.removeScriptMessageHandler(forName: "onError")
}
成功。
注意:不要在viewWillDisappear中使用webView.configuration.userContentController.removeAllUserScripts(),這樣做同樣使得控制器不被釋放。