iOS界面启动耗时检测

背景:

近期在做公司内部使用的iOS应用性能检测组件及项目性能优化的工作,有个需求是能量化的统计各个界面的启动耗时。

通常,项目中页面启动的耗时长短通常肉眼可见,但当我们在对项目进行界面启动耗时优化时,我们通常需要知道VC启动耗时的数据,并收集进行对比,此时我们需要能够实现记录界面启动耗时的数据来进行量化的分析。


方案分析:


iOS界面启动耗时检测_第1张图片
UIViewControlle生命周期图

通常这种通用的需求,我们首先想到的方案便是使用AOP,针对VC的生命周期方法进行swizzle,打点记录每个生命周期方法的时间点,即可获取VC的耗时。但是实际实践这种方案存在一个弊端,因为我们hook 的是UIViewController的方法,果我们在自己的 VC 中重写了对应的方法,并执行了一些耗时的操作,那么这些操作的时间就没有被计算进去。所以,基于这个方案,需要做进一步的改进。


目前使用的改进方案是:

1.对需要监听的类的实例化时进行KVO,监听一个不存在的KeyPath。通过它来创建子类。

2.对KVO创建出来的子类添加需要Swizzle的方法对应的SEL及其IMP。因为本质上KVO只是对setter和getter方法进行了override,如果不提供自定义的实现,还是会调用到原来的类的IMP。

3.在实例销毁的时候,将KVO监听移除,避免导致KVO still registering when deallocated这样的Crash。

4.对于记录的界面耗时记录信息,收集到一份列表中,有一个recorder类维护列表,并提供一个List界面进行展示,可以在程序中直接查看检测数据。


具体实现可见我的Github


参考:

巧妙利用KVO实现精准的VC耗时检测

一种基于KVO的页面加载,渲染耗时监控方法

你可能感兴趣的:(iOS界面启动耗时检测)