使用WKWebView注意內(nèi)存釋放

往WKWebView內(nèi)注入JS方法時(shí),出現(xiàn)內(nèi)存無(wú)法釋放問(wèn)題

先說(shuō)說(shuō)wkWebView與JS交互的方法吧

WKWebViewConfiguration*config = [[WKWebViewConfigurationalloc] init];

[config.userContentController addScriptMessageHandler:selfname:@"與后臺(tái)約定的方法名"];

//創(chuàng)建webView

WKWebView ?*webView ?= [[WKWebView alloc]initWithFrame:self.view.frame configuration:config];

wenView.navigationDelegate = self;

在上面的這個(gè)方法里面去創(chuàng)建一個(gè)webView,并且約定方法名稱。

執(zhí)行本地的方法時(shí)會(huì)調(diào)用以下代理方法

-(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message{

//message.body

可以打印JS端給你傳過(guò)來(lái)的數(shù)據(jù),可以根據(jù)數(shù)據(jù)去執(zhí)行相應(yīng)的方法

}

你以為JS調(diào)用本地的方法就完事了嗎?

錯(cuò)誤,你會(huì)發(fā)現(xiàn)調(diào)用方法后,內(nèi)存根本不釋放。也就是dealloc方法不執(zhí)行。

問(wèn)題就出現(xiàn)在

[config.userContentController addScriptMessageHandler:self name:@"與后臺(tái)約定的方法名"];

這句代碼上面,準(zhǔn)確的說(shuō)是“self”的身上。

那么怎么解決呢?

解決方法一

我們可以把self換掉,就是說(shuō)用其他換掉self,這里面就要新建一個(gè)類

在.h里面是這樣的

#import

@interfaceXLWeakScriptMessageDelegate:NSObject

@property(nonatomic,weak)id scriptDelegate;

- (instancetype)initWithDelegate:(id)scriptDelegate;

@end

在.m里面是這樣的

#import "XLWeakScriptMessageDelegate.h"

@implementationXLWeakScriptMessageDelegate

- (instancetype)initWithDelegate:(id)scriptDelegate{

self= [superinit];

if(self) {

_scriptDelegate =scriptDelegate;

}

return self;

}

- (void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message{

[

self.scriptDelegateuserContentController:userContentControllerdidReceiveScriptMessage:message];

}

@end

新建的類我都寫在這里了,大家可以拿過(guò)去直接用。

下面說(shuō)的是最重要的改動(dòng),就是把

WKWebViewConfiguration*config = [[WKWebViewConfigurationalloc] init];

[config.userContentController addScriptMessageHandler:self name:@"與后臺(tái)約定的方法名"];

這里面的代碼改造成

WKWebViewConfiguration*config = [[WKWebViewConfigurationalloc] init];

[config.userContentController addScriptMessageHandler:[[

XLWeakScriptMessageDelegatealloc] initWithDelegate:self] name:@"callback"];

//創(chuàng)建webViewWKWebView*webView = [[WKWebViewalloc] initWithFrame:self.view.frameconfiguration:config];

webView.navigationDelegate = self;

這樣一來(lái),會(huì)發(fā)現(xiàn)內(nèi)存釋放了,dealloc方法會(huì)被執(zhí)行了。

解決方法二、

.在當(dāng)前界面顯示的時(shí)候往WKWebView中注入JS,當(dāng)界面消失時(shí)移除JS方法

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

[self.webView..configuration.userContentController addScriptMessageHandler:self name:@"與后臺(tái)約定的方法名"];

}

- (void)viewWillDisappear:(BOOL)animated {

[super viewWillAppear:animated];

[self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"與后臺(tái)約定的方法名"];

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、加載網(wǎng)頁(yè) WKWebView *webView = [[WKWebView alloc] initWithFr...
    LearningCoding閱讀 3,265評(píng)論 0 2
  • 前言: web頁(yè)面和app的直接的交互是很常見(jiàn)的東西,在ios8之前,用的是uiwebview,但是在ios8之后...
    qingchen91閱讀 3,073評(píng)論 6 25
  • 開(kāi)發(fā)App的過(guò)程中,常常會(huì)遇到在App內(nèi)部加載網(wǎng)頁(yè),通常用UIWebView加載。這個(gè)自iOS2開(kāi)始使用的網(wǎng)頁(yè)加載...
    皮皮瑞閱讀 420評(píng)論 0 0
  • 前言 Xcode8發(fā)布以后,編譯器開(kāi)始不支持IOS7,所以很多應(yīng)用在適配IOS10之后都不在適配IOS7了,其中包...
    Zoneday閱讀 2,150評(píng)論 0 2
  • “拿破侖用劍未竟的事業(yè), 我將用筆予以完成。”巴爾扎克在他的偶像拿破侖塑像的劍鞘上刻下這么一句話。他做到了嗎? 巴...
    江南吹雪閱讀 1,829評(píng)論 2 19

友情鏈接更多精彩內(nèi)容