*易的面试中的,面试官问了我一个如何检测页面卡顿的问题。当时没有回答好,所以来总结一下。
问题
1.如何检测iOS页面卡顿。
2.检查到卡顿的时候,需要将所有线程的堆栈信息,CPU,内存信息写入本地日志文件。
页面卡顿的原因
导致卡顿问题的几种原因:
- 复杂UI,图文混排的绘制量过大;
- 在主线程上做网络同步请求;
- 在主线程做大量的IO操作;
- 运算量过大,CPU持续高占用;
- 死锁和主子线程抢锁。
卡顿的检查方案
通过监控主线程的RunLoop的状态来判断是否出现卡顿。将创建好的观察者 runLoopObserver 添加到主线程 RunLoop 的 common 模式下观察。然后,创建一个持续的子线程专门用来监控主线程的 RunLoop 状态。一旦发现进入睡眠前的 kCFRunLoopBeforeSources 状态,或者唤醒后的状态 kCFRunLoopAfterWaiting,在设置的时间阈值内一直没有变化,即可判定为卡顿。
我自己实践的代码