最近工作中在crash日志收集到这样的信息:SEGV_ACCERR CFNetwork __ZN12HTTPProtocol23shouldAttemptOriginLoadEv
HTTPProtocol::shouldAttemptOriginLoad(),
HTTPProtocol::_protocolInterface_startLoad
如图1:
经过多番的资料查询,了解到这是iOS12.x系统会出现的一个问题。CFNetwork crash on iOS 12.x。苹果网站上面出现过相关crash的讨论,但没有找到一个说出解决方案的,我们经过长时间推敲,有以下复现方式和解决方案。
您可以通过NSURLProtocol对请求进行拦截,在startLoading和stopLoading方法的堆栈跟踪来确定___ZN19URLConnectionLoader27_private_ScheduleOriginLoadEPK12NSURLRequestPK20_CFCachedURLResponse_block_invoke_2调用startLoading,而CFURLProtocol_NS :: _ protocolInterface_cancelLoad()由于cancel请求会调用stopLoading.
crash的复现方式总结如下:
在项目中对某一个请求循环发送500+次,每次send之前cancel掉上一次的请求,即可复现这种crash,且是必现。如图2:
我司项目中是某一个列表因特殊原因每次需要用SDWebImage进行请求(此处请求不是取磁盘或内存中的图片)频率过高导致(SD一般不会产生这样的问题,因为多数取的缓存,而且SD默认有开启线程的个数限制的,若想复现bug,可通过options每次走远程请求)。如果您遇见了,可以查看是不是在滑动列表的时候在不断send和cancel网络请求
希望以上能帮到同行们,上述若有不足或错误,盼请指正!!!