WebViewJavascriptBridge對象銷毀

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");
},

經過測試,沒有問題,完美!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言 Web 頁面中的 JS 與 iOS Native 如何交互是每個 iOS 猿必須掌握的技能。而說到 Nati...
    幽城88閱讀 2,230評論 1 8
  • WebViewJavascriptBridge是一個有點年代的JS與OC交互的庫,使用該庫的著名應用還挺多的,目前...
    咖啡綠茶1991閱讀 1,005評論 0 5
  • 設計模式是什么? 你知道哪些設計模式,并簡要敘述? 設計模式是一種編碼經驗,就是用比較成熟的邏輯去處理某一種類型的...
    iOS菜鳥大大閱讀 732評論 0 1
  • 1,NSObject中description屬性的意義,它可以重寫嗎?答案:每當 NSLog(@"")函數中出現 ...
    eightzg閱讀 4,185評論 2 19
  • 新年啦,新的一年到來啦,今天家家戶戶團圓的時刻,不管上一年是過得得意還是過得失意,過去的已經過去,新的一年開始,祝...
    奶思醬閱讀 94評論 0 1