WebViewJavascriptBridge對象銷毀
在項目中,為了與js交互,頁面A引用了WebViewJavascriptBridge框架創建了WebViewJavascriptBridge對象,沒有測試頁面A退出時,頁面A是否銷毀。近日,頁面A播放了一段音樂,發現在退出頁面A后,音樂仍在播放中,沒法關閉,只有kill掉app。
查找后發現,WebViewJavascriptBridge部分源碼如下
@implementation WKWebViewJavascriptBridge {
WKWebView* _webView;
id<WKNavigationDelegate> _webViewDelegate;
long _uniqueId;
WebViewJavascriptBridgeBase *_base;
}
- (void)setWebViewDelegate:(id<WKNavigationDelegate>)webViewDelegate {
_webViewDelegate = webViewDelegate;
}
需要在 -(void)viewWillDisappear:(BOOL)animated 或 - (void)viewDidDisappear:(BOOL)animated 中設置setWebViewDelegate為nil,頁面A才會銷毀。
項目中導入了JAPatch,main.js中相關代碼如下:
viewWillDisappear: function(animated) {
self.super().viewWillDisappear(animated);
self.bridge().setWebViewDelegate(null);
},
執行后發現頁面A銷毀了,但相應的WebViewJavascriptBridge對象沒有銷毀,音樂播放仍在繼續中。 想起在JSPatch文檔-內存釋放問題中看到的
如果一個 OC 對象被 JS 引用,或者在 JS 創建這個對象,這個 OC 對象在退出作用域后不會馬上釋放,而是會等到 JS 垃圾回收時才釋放,這會導致一些 OC 對象延遲釋放,
沒有被 JS 引用過的 OC 對象不受影響。
經過測試發現,在頁面A銷毀后,一分鐘左右時間之后,相應的WebViewJavascriptBridge對象會銷毀(dealloc會調用),音樂播放停止。怎么在JS中部引用WebViewJavascriptBridge對象呢?KVC。代碼如下:
viewWillDisappear: function(animated) {
self.super().viewWillDisappear(animated);
//delegate是強引用
self.setValue_forKeyPath(null, "bridge.webViewDelegate");
},
經過測試,沒有問題,完美!