在使用WKWebView
时,发现当前控制器pop完之后没有执行dealloc
方法,存在内存泄漏。
首先排查了一下blcok
中是否存在循环引用,发现并没有,使用Instruments
的leaks
工具也没有发现相关的内存泄漏。然后我留意到在viewDidLoad
方法中调用了[_webview.configuration.userContentController addScriptMessageHandler:self name:@"xx"];
方法,并实现代理方法- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
,在dealloc
方法中调用对应的[_webview.configuration.userContentController removeScriptMessageHandlerForName:@"xx"];
移除方法,但是dealloc
并没有执行。
解决办法:不在viewDidLoad
和dealloc
方法中添加和移除,改为在控制器将要显示和消失的方法中添加和移除。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[_webview.configuration.userContentController addScriptMessageHandler:self name:@"xx"];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[_webview.configuration.userContentController removeScriptMessageHandlerForName:@"xx"];
}
ps:在使用WKWebView
时,通过js
调用原生方法,可以拦截url
,也可以用上面这种方法。