二次访问WKWebView的backForwardList相关列表触发EXC_I386_GPFLT崩溃
WKWebView访问backList崩溃原因
核心崩溃原因
- 非主线程访问WKWebView属性:苹果官方明确要求WKWebView的所有属性访问、API调用都必须在主线程执行,子线程访问会触发偶现的野指针崩溃。首次调用时底层相关资源刚好处于就绪状态不会触发异常,第二次调用时临时资源已经被释放,就会抛出EXC_I386_GPFLT坏地址访问错误。
- WKWebView实例已释放:调用代码时如果WKWebView实例已经被ARC回收,访问野指针的属性就会触发崩溃。
- 系统版本底层Bug:部分iOS 13~14版本存在底层缺陷,在WKWebView执行页面跳转、goBack/goForward操作后立刻访问backList,会出现底层WKBackForwardList实例提前释放的问题,导致访问崩溃。
修复方案
强制在主线程访问,同时添加弱引用判断避免野指针:
DispatchQueue.main.async { [weak webView] in guard let webView = webView else { return } let backList = webView.backForwardList.backList // 直接遍历数组即可,无需手动截取区间避免越界 for item in backList { print(item.title ?? "") } }
内容的提问来源于stack exchange,提问作者Sajjad Ali
相关产品推荐
相关产品推荐

