我們之前說到,想要統計每個頁面的啟動時間。我們可以知道,每個頁面都繼承了UIViewController,假設每個頁面開始啟動的時間大概在LoadView的時候,結束啟動的時間大概在在ViewDidAppear的時候。
問題1:
應該如何盡量少的改動原有代碼實現這個功能呢?
回答:
因為每個頁面都繼承UIViewController,所以如果我們能夠修改UIViewController的LoadView和ViewDidAppear方法就好了。
問題2:
但是UIViewController是系統類,如何修改系統類的實現?
回答:
可以參看我的文章深入淺出理解分類(category)和類擴展(extension),使用分類來重寫LoadView和ViewDidAppear方法。同時重寫+load方法,在其中實現分類loadView和本類loadView的代碼互換。
下面我們可以通過一個例子來看看能否實現交換loadView和UIViewController。
1.創建一個UIViewController的分類。這個交換方法其實原理是runtime,所以要加入頭文件<objc/runtime.h>
2.在其中重寫LoadView和ViewDidAppear方法,注意不要取和本類同樣的名字。然后寫一個load方法,用于在加載時替換方法。
swizzle1.png
3.下面寫一下交換方法的函數實現,基本寫法是一樣的,就寫一個+ (void)swizzledLoadViewSel()的實現
swizzle2.png
4.這個時候還有一件事,在我們寫的loadView_Swizzle以及ViewDidAppear_Swizzle中調用本類方法。因為我們不知道系統類怎么實現的,需要先調用父類的方法,再完成自己的實現。
swizzle2.5.png
5.下面讓我們測試一下,首先我們有一個默認的ViewController,.m文件如下圖所示:
swizzle3.png
6.我們運行一下,看一下控制臺:
swizzle4.png