使用runtime交換系統(tǒng)類方法(神奇的swizzle)

我們之前說到,想要統(tǒng)計每個頁面的啟動時間。我們可以知道,每個頁面都繼承了UIViewController,假設(shè)每個頁面開始啟動的時間大概在LoadView的時候,結(jié)束啟動的時間大概在在ViewDidAppear的時候。

問題1:

應(yīng)該如何盡量少的改動原有代碼實(shí)現(xiàn)這個功能呢?

回答:

因?yàn)槊總€頁面都繼承UIViewController,所以如果我們能夠修改UIViewController的LoadView和ViewDidAppear方法就好了。

問題2:

但是UIViewController是系統(tǒng)類,如何修改系統(tǒng)類的實(shí)現(xiàn)?

回答:

可以參看我的文章深入淺出理解分類(category)和類擴(kuò)展(extension),使用分類來重寫LoadView和ViewDidAppear方法。同時重寫+load方法,在其中實(shí)現(xiàn)分類loadView和本類loadView的代碼互換。

下面我們可以通過一個例子來看看能否實(shí)現(xiàn)交換loadView和UIViewController。

1.創(chuàng)建一個UIViewController的分類。這個交換方法其實(shí)原理是runtime,所以要加入頭文件<objc/runtime.h>

2.在其中重寫LoadView和ViewDidAppear方法,注意不要取和本類同樣的名字。然后寫一個load方法,用于在加載時替換方法。

swizzle1.png

3.下面寫一下交換方法的函數(shù)實(shí)現(xiàn),基本寫法是一樣的,就寫一個+ (void)swizzledLoadViewSel()的實(shí)現(xiàn)

swizzle2.png

4.這個時候還有一件事,在我們寫的loadView_Swizzle以及ViewDidAppear_Swizzle中調(diào)用本類方法。因?yàn)槲覀儾恢老到y(tǒng)類怎么實(shí)現(xiàn)的,需要先調(diào)用父類的方法,再完成自己的實(shí)現(xiàn)。

swizzle2.5.png

5.下面讓我們測試一下,首先我們有一個默認(rèn)的ViewController,.m文件如下圖所示:

swizzle3.png

6.我們運(yùn)行一下,看一下控制臺:

swizzle4.png

7.可以看出來,我們調(diào)用了分類里面寫的LoadView和ViewDidLoad中的內(nèi)容,完成了系統(tǒng)類方法和分類方法的交換。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,904評論 33 466
  • 繼上Runtime梳理(四) 通過前面的學(xué)習(xí),我們了解到Objective-C的動態(tài)特性:Objective-C不...
    小名一峰閱讀 855評論 0 3
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,098評論 0 9
  • /* UIViewController is a generic controller base class th...
    DanDanC閱讀 2,061評論 0 2
  • 1.margin與百分比單位 2.margin重疊 margin重疊通常特性: 只發(fā)生在block水平元素(例如:...
    徐國軍_plus閱讀 1,193評論 0 2

友情鏈接更多精彩內(nèi)容