我們之前說到,想要統(tǒng)計每個頁面的啟動時間。我們可以知道,每個頁面都繼承了UIViewController啥刻,假設每個頁面開始啟動的時間大概在LoadView的時候,結(jié)束啟動的時間大概在在ViewDidAppear的時候咪笑。
問題1:
應該如何盡量少的改動原有代碼實現(xiàn)這個功能呢可帽?
回答:
因為每個頁面都繼承UIViewController,所以如果我們能夠修改UIViewController的LoadView和ViewDidAppear方法就好了窗怒。
問題2:
但是UIViewController是系統(tǒng)類映跟,如何修改系統(tǒng)類的實現(xiàn)蓄拣?
回答:
可以參看我的文章深入淺出理解分類(category)和類擴展(extension),使用分類來重寫LoadView和ViewDidAppear方法。同時重寫+load方法努隙,在其中實現(xiàn)分類loadView和本類loadView的代碼互換球恤。
下面我們可以通過一個例子來看看能否實現(xiàn)交換loadView和UIViewController。
1.創(chuàng)建一個UIViewController的分類荸镊。這個交換方法其實原理是runtime咽斧,所以要加入頭文件<objc/runtime.h>
2.在其中重寫LoadView和ViewDidAppear方法,注意不要取和本類同樣的名字躬存。然后寫一個load方法张惹,用于在加載時替換方法。
3.下面寫一下交換方法的函數(shù)實現(xiàn)优构,基本寫法是一樣的,就寫一個+ (void)swizzledLoadViewSel()的實現(xiàn)
4.這個時候還有一件事雁竞,在我們寫的loadView_Swizzle以及ViewDidAppear_Swizzle中調(diào)用本類方法钦椭。因為我們不知道系統(tǒng)類怎么實現(xiàn)的,需要先調(diào)用父類的方法碑诉,再完成自己的實現(xiàn)彪腔。
5.下面讓我們測試一下,首先我們有一個默認的ViewController进栽,.m文件如下圖所示:
6.我們運行一下德挣,看一下控制臺:
7.可以看出來,我們調(diào)用了分類里面寫的LoadView和ViewDidLoad中的內(nèi)容快毛,完成了系統(tǒng)類方法和分類方法的交換格嗅。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者