往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睬塌,并且約定方法名稱(chēng)谨胞。
執(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è)類(lèi)
在.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
新建的類(lèi)我都寫(xiě)在這里了净宵,大家可以拿過(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)約定的方法名"];
}