0%

WKWebView的坑之iOS9以下版本退出闪退

问题描述

在iOS9及以下版本中,WKWebView在自定义了他的scrollView.delegate为当前ViewController时,如果退出当前ViewController会闪退。提醒EXC_BAD_ACCESS错误并且闪退,

错误堆栈是-[UIScrollView(AdhocVisualEdit) adhoc_scrollViewSetDelegate:]

上一级是-[WKScrollView _updateDelegate]

原因分析

考虑是在iOS9及以下版本中,苹果对于delegateweak的处理没有如预期。导致在退出当前ViewController的时候更新scrollViewdelegate还是使用了已经释放的ViewController,从而导致EXC_BAD_ACCESS错误而闪退。

这个问题在iOS10及以上版本中已经修复,不再闪退。

解决办法

在当前ViewController释放的时候,设置WKWebViewscrollView.delegate为nil。

代码如下:

1
2
3
4
5
6
7
8
9
10
// Objective-C
- (void)dealloc
{
_webView.scrollView.delegate = nil;
}

// Swift
deinit {
webView.scrollView.delegate = nil
}

Reference List

iOS WKWebView.scrollView delegate cause BAD_ACCESS