背景:
近期在做公司內(nèi)部使用的iOS應(yīng)用性能檢測組件及項目性能優(yōu)化的工作,有個需求是能量化的統(tǒng)計各個界面的啟動耗時。
通常,項目中頁面啟動的耗時長短通常肉眼可見,但當(dāng)我們在對項目進行界面啟動耗時優(yōu)化時,我們通常需要知道VC啟動耗時的數(shù)據(jù),并收集進行對比,此時我們需要能夠?qū)崿F(xiàn)記錄界面啟動耗時的數(shù)據(jù)來進行量化的分析。
方案分析:

通常這種通用的需求,我們首先想到的方案便是使用AOP,針對VC的生命周期方法進行swizzle,打點記錄每個生命周期方法的時間點,即可獲取VC的耗時。但是實際實踐這種方案存在一個弊端,因為我們hook 的是UIViewController的方法,果我們在自己的 VC 中重寫了對應(yīng)的方法,并執(zhí)行了一些耗時的操作,那么這些操作的時間就沒有被計算進去。所以,基于這個方案,需要做進一步的改進。
目前使用的改進方案是:
1.對需要監(jiān)聽的類的實例化時進行KVO,監(jiān)聽一個不存在的KeyPath。通過它來創(chuàng)建子類。
2.對KVO創(chuàng)建出來的子類添加需要Swizzle的方法對應(yīng)的SEL及其IMP。因為本質(zhì)上KVO只是對setter和getter方法進行了override,如果不提供自定義的實現(xiàn),還是會調(diào)用到原來的類的IMP。
3.在實例銷毀的時候,將KVO監(jiān)聽移除,避免導(dǎo)致KVO still registering when deallocated這樣的Crash。
4.對于記錄的界面耗時記錄信息,收集到一份列表中,有一個recorder類維護列表,并提供一個List界面進行展示,可以在程序中直接查看檢測數(shù)據(jù)。
具體實現(xiàn)可見我的Github
參考: