背景:
近期在做公司内部使用的iOS应用性能检测组件及项目性能优化的工作,有个需求是能量化的统计各个界面的启动耗时。
通常,项目中页面启动的耗时长短通常肉眼可见,但当我们在对项目进行界面启动耗时优化时,我们通常需要知道VC启动耗时的数据,并收集进行对比,此时我们需要能够实现记录界面启动耗时的数据来进行量化的分析。
方案分析:
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
参考:
网友评论