談談Category和Extension

3033發表於2017-12-14

###開篇 在平時的專案中時常可以用到Category,在研究別人的程式碼時遇見Category和Extension也是一件極其平常的事情。還記得當我第一次見到這種寫法的時候我的內心是崩潰的。

示例1.png
一串的"+"號,這是什麼鬼簡直顛覆我的三觀好麼,完全的一頭霧水,經過慢慢的研究才發現了他的好處,原來還可以這樣玩,不錯不錯。但是接著又發現一個問題Extension是什麼呢,持續的懵逼中...今天我們就來談談Category和Extension 究竟有何神奇之處。 ###效果簡單展示

AppDelegate_m.png

AppDelegate_m 2.png

我們來看一下上面的兩張appdelegate.m的內容,兩個簡單的小工程中,一個的內容中有上百行甚至幾百行的程式碼,另一個卻只有幾行,我們先不說Category的別的功能單單是程式碼的分塊,清晰條理和程式碼的可讀性上就值得我們研究一番更何況他不止於此呢。 ###建立方法 既然那麼好用我們怎麼建立他呢,話不多說上圖片。

建立1.png

建立2.png
###原理 #####Category

  • 有兩方面侷限性: (1)無法向類中新增新的例項變數,類別沒有位置容納例項變數。 (2)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具有更高的優先順序。類別方法將完全取代初始方法從而無法再使用初始方法。
  • 主要有3個作用: (1)可以將類的實現分散到多個不同檔案或多個不同框架中,方便程式碼管理。也可以對框架提供類的擴充套件(沒有原始碼,不能修改)。 (2)建立對私有方法的前向引用:如果其他類中的方法未實現,在你訪問其他類的私有方法時編譯器報錯這時使用類別,在類別中宣告這些方法(不必提供方法實現),編譯器就不會再產生警告 (3)向物件新增非正式協議:建立一個NSObject的類別稱為“建立一個非正式協議”,因為可以作為任何類的委託物件使用。

####Extension

  • Extension常被稱為是匿名的Category(比如:在字串中類擴充套件extension,新增的屬性str1和show方法都是私有的,只能在String類中可以訪問得到 )
  • 用於給類新增新方法,但只作用於原始類,不作用於subclass
  • 只能對有implementation原始碼的類寫Extension,對於沒有implementation原始碼的類,比如framework class,是不可以的 Extension可以給原始類新增新方法,以及新屬性

####他們的主要區別是: 1、形式上來看,extension是匿名的category。 2、extension裡宣告的方法需要在mainimplementation中實現,category不強制要求。 3、extension可以新增屬性(變數),category不可以。 ###使用舉例 個人感覺在專案中Category的使用還是比較多的現在舉個簡單的程式碼例子

UIButton_GSbutton_h.png

在工程中建立兩個Category的分類,一個是UIButton的一個是appdelegate的。在.h檔案中按鈕的類暴露的方法如圖所示。我們在.m中實現它,如下圖

UIButton_GSbutton_m.png
類的方法實現之後我們匯入類名,來呼叫方法。

按鈕建立.png
我們直接呼叫我們自己建立的方法,給予他設定名稱和已經確定的名稱顏色和背景,在大規模使用中可以減少我們的程式碼量。 同樣的道理我們也可以在appdelegate中建立分類,實現自己想要的功能實現程式碼的分塊。

AppDelegate_GSCategory_h.png
同時通過圖中劃線的方法我們可以獲取函式中的相應引數,以供相應的方法中使用,比如極光推送需要的application和launchoptions ,然後在.m檔案中實現自己需要的方法就可以對程式碼進行分塊了。

AppDelegate_m.png
這個圖為appdelegate中使用Category以後的程式碼形式,是不是簡潔了許多。 ####後記 文中的內容僅僅是自己的一點想法,有錯誤的地方謝謝各位的指出,以後有時間會繼續分享一些Category和Extension的認識。

相關文章