最近工作中在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網絡請求
希望以上能幫到同行們,上述若有不足或錯誤,盼請指正!!!