昨天开发app时遇到闪退的问题,而且这次的闪退类型是我遇过的最棘手的。连上xcode时,运行没问题;断开后,闪退很频繁。
此时app的代码也有将近3000行了,要找到问题实在是难啊。
问题是这样的,app可以正常运行,一旦按下Home键或锁屏,再回到app,app的界面会僵住,再过一会儿就闪退。
有群友推荐我使用bugly,遂集成了,但是bugly后台连运行的数据都没有。可能因为我用的是swiftui,框架较新,bugly不支持。只好硬着头皮继续调试。
经过无数次的调试,遂找到了有用的规律。首先我猜测,闪退并不是崩溃,而是由于主线程长期无回应,被ios后台强行杀掉了。而连上xcode时,由于一些机制,app并不会被强行杀掉,会一直等到主线程被唤醒。所以只要找到使app僵住的原因就好了。又因为僵住出现在重回app时,所以问题应该出现在线程的挂起和唤醒上。
又经过无数次的观察,发现在使用腾讯cos sdk下载东西时,按下home键再回来,app僵住的概率较大。于是关闭大部分功能,使用cos下载大量数据,果然问题出现了。所以我推测,cos的内部每接收到一个任务,就会开启一个线程。当任务多了,ios后台挂起和唤醒它的任务量就会变大,导致主线程僵住。
那么当cos只有一个任务在执行时,会不会出现问题呢?于是我又进行了测试,发现没问题。
于是在cos上又封装了串行执行的功能,问题得到解决。不仅闪退的问题解决了,困扰我的卡顿问题也得到缓解。