WKWebView js通信的內存泄露問題

蘋果在WKWebView上做的最讚的事兒就是顯式的支持了js通信。用法很簡單:

一個協議:WKScriptMessageHandler 一個類:WKUserContentController

創建一個實例A,該實例遵循WKScriptMessageHandler協議,並將實例A與WKWebView綁定(有一個共同的對象持有他們倆即可),這樣,實例A便可以獲得與WKWebView對應的WKUserContentController實例B(WKWebView.configuration.userContentController)。實例B的方法:

- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;

通過這個方法將實例A傳給scriptMessageHandler,然後自定義一個name。後續h5就可以通過一套標準的接口找到js處理的響應器。

window.webkit.messageHandlers.name.postMessage({
    'method': 'notifyMessageToNative',
    'params': jsonString
});

而WKScriptMessageHandler協議只有一個方法:

/*! @abstract Adds a script message handler.

 @param scriptMessageHandler The message handler to add.

 @param name The name of the message handler.

 @discussion Adding a scriptMessageHandler adds a function

 window.webkit.messageHandlers.<name>.postMessage(<messageBody>) for all

 frames.

 */

- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;

實例A中實現這個方法,它會從WKScriptMessage對象中拿到所有h5傳遞過來的信息,你只要處理即可。

是不是用着很爽??????

但是這裏有個坑,一不小心就會造成內存泄露。

這裏webkit對你傳入的scriptMessageHandler是一個強引用。當確定自己的WebView不需要接受js消息時(如自己的WebView將要釋放),就要把scriptMessageHandler移除。方法很簡單:

與前面addScriptMessageHandler對應的,有一個remove方法:

/*! @abstract Removes a script message handler.

 @param name The name of the message handler to remove.

 */

- (void)removeScriptMessageHandlerForName:(NSString *)name;

調用即可。

這裏希望大家對與WebView相關的內存管理要高度敏感,畢竟有泄露的話量會很大。切記!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章