iOS开发--- WKWebView导致Controller不调用dealloc
2017-04-26 11:12
567 查看
导读:本文主要解决WKWebView在通过WKUserContentController添MessageHandler方法用于JS调用Native导致ViewController内存泄露,无法正常释放。
之后检查了ViewController中所有使用到self的地方,发现WKUserContentController的下面这个方法有使用到self:
App注册方法用于JS调用
所以Google了一下该方法是否会引起ViewController不调用dealloc方法。确实是由于该方法引起ViewController内存泄漏。
搜到的结果
1.ViewController没有调用dealloc可能的原因
在使用WKWebView时,ViewController在该释放的时候没有释放(没有调用- (void)dealloc方法)。参考了这篇文章检查了ViewController中的NSTimer、delegate并将所有block中的self更换为weakSelf,结果仍然没有调用dealloc方法。
之后检查了ViewController中所有使用到self的地方,发现WKUserContentController的下面这个方法有使用到self:
App注册方法用于JS调用
- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name
WKWebViewConfiguration *wkConfig = [[WKWebViewConfiguration alloc] init]; wkConfig.userContentController = [[WKUserContentController alloc] init]; [wkConfig.userContentController addScriptMessageHandler:self name:@"Native"];
所以Google了一下该方法是否会引起ViewController不调用dealloc方法。确实是由于该方法引起ViewController内存泄漏。
搜到的结果
2. 解决方案
(1)WeakScriptMessageDelegate
可以创建一个新的类WeakScriptMessageDelegate,也可以将@interface-@end写在ViewController.h中,@implementation-@end写在ViewController.m中。@interface WeakScriptMessageDelegate : NSObject<WKScriptMessageHandler> @property (nonatomic, weak) id<WKScriptMessageHandler> scriptDelegate; - (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate; @end
@implementation WeakScriptMessageDelegate - (instancetype)initWithDelegate:(id<WKScriptMessageHandler>)scriptDelegate { self = [super init]; if (self) { _scriptDelegate = scriptDelegate; } return self; } - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message]; } @end
(2)使用
添加了下面这行代码之后ViewController就会调用dealloc方法,此时ViewController已经正常释放。但是WeakScriptMessageDelegate没有释放,需要在dealloc中将WeakScriptMessageDelegate释放掉。WKWebViewConfiguration *wkConfig = [[WKWebViewConfiguration alloc] init]; wkConfig.userContentController = [[WKUserContentController alloc] init]; [wkConfig.userContentController addScriptMessageHandler:[[WeakScriptMessageDelegate alloc] initWithDelegate:self] name:@"Native"];
(3)释放WeakScriptMessageDelegate
- (void)dealloc { [self.wkConfig.userContentController removeScriptMessageHandlerForName:@"Native"]; }
相关文章推荐
- 【iOS开发】从 UIWebView 到 WKWebView--简书
- iOS下JS与OC互相调用(二)--WKWebView 拦截URL
- iOS开发之WKWebView简单使用
- iOS下JS与OC互相调用(二)-->WKWebView 拦截URL
- iOS 加载HTML的相关问题(与JS的互相调用和WKWebView加载本地网页)
- iOS开发之Xcode8推出的WKWebView与UIWebView的使用
- iOS开发中的WKWebView与JS的交互
- [iOS开发]WKWebView加载JS
- iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge
- iOS WKWebView 混合应用开发时代来临 - 嵌入式 JS 的调试成为催化剂
- 关于IOS开发中addSubView上去的viewController的viewWillAppear 和viewDidAppear 等调用的总结
- iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge
- 微信iOS WKWebview 网页开发适配指南
- 【iOS开发】从 UIWebView 到 WKWebView
- iOS开发-------基于WKWebView的原生与JavaScript数据交互
- iOS下JS与OC互相调用(二)--WKWebView 拦截URL
- iOS开发之WKWebView简单使用
- 微信iOS WKWebview 网页开发适配指南
- iOS开发--iOS类微信返回导航WebViewController(AXWebViewController)
- iOS开发之Xcode8推出的WKWebView与UIWebView的使用