iOS-WKWebView引起的循环引用


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

你可能感兴趣的:(iOS-WKWebView引起的循环引用)