原因
首先看了 crash log,一如猜测,的确是卡在了主线程
为了避免应用陷入错误状态导致界面无响应,Apple 设计了看门狗 (WatchDog) 机制。一旦超时,强制杀死进程。在不同的生命周期,触发看门狗机制的超时时间有所不同:
首先说一说异常编码,也是寓意颇深。8badf00d = ate bad food,异常记录则表示这并不是一次崩溃。信息一栏指出时间限制为 20 s。结合应用业务来看,表层原因在于:每次启动应用对于启动广告首先每次都会对图片在磁盘中是否存在进行查找,在查找结束后,如果没有图片在进行下载,下载完成写入磁盘中。然而不幸的是,对图片的查找发生在主线程。
一般来说同步网络请求,主线程,超长超时时间,满足这三点,一定场景下几乎必然会触发看门狗机制。
常用解决方案:
异步网络请求:优点很多,最重要的是可以让你无忧无虑安全地访问网络,而无需担心线程。
通过 RunLoop 来操控一切,一旦超过既定的超时时间,就提示用户重试或者暂时先跳过网络请求。
I/O 读写文件和大规模运算等耗时任务也极有可能触发看门狗机制。合理处理线程,优化耗时任务,很大程度能避免不佳用户体验。
注意:调试模式下完全是因为该模式下看门狗机制处于禁用状态。