iOS categoryde用法以及extension的區別

OS中category即:類別 ;extension 爲擴張 xcode

一.category  框架

類別是一種爲現有的類添加新方法的方式。 函數

利用Objective-C的動態運行時分配機制,Category提供了一種比繼承(inheritance)更爲簡潔的方法來對class進行擴展,無需建立對象類的子類就能爲現有的類添加新方法,能夠爲任何已經存在的class添加方法,包括那些沒有源代碼的類(如某些框架類)。 spa

1.類別的侷限:(1)沒法向類別中添加新的實例變量,類別沒有位置容納實例變量。若是必定要添加實例變量,能夠採用runtime 庫objc_setAssociatedObject / objc_getAssociatedObject 函數來解決。objc_setAssociatedObject 就是將一個對象跟另外一個對象進行關聯,並用一個key來標示,objc_getAssociatedObject 就是用這個key來拿到與receiver相關聯的一個對象。 .net


注意:必須使用@dynamic來讓編譯器知道咱們本身實現setter/getter方法(若是對於@dynamic有疑問,請參見:http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences) code

         不能使用@synthesize(也不能@dynamic 和@synthesize都不寫,什麼都不寫在最新的xcode裏是默認@synthesize),@synthesize會自動生成成員變量,並自動生成setter/getter方法。 對象

         最後,objc_setAssociatedObject 的關聯的policy 能夠根據本身的需求使用,這個例子使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC來標示一個strong reference來指向被關聯的對象。 繼承

(2)名稱衝突,即當類別中的方法名與原始類中的名稱相同的時候,類別具備更高的優先級。類別的方法將徹底取代原始方法而沒法再使用原始方法。 ci


這段話的說法是不嚴謹的,類別並非有更高的優先級,在運行時,類與類別的運行循序有關係。
假如類別和類都有同一個方法 methodA,那麼在 runtime 期要先把類中的 method 放入方法棧裏,而後再放類別中 method A,這樣是在方法棧中放了兩個 methodA。
在調用 methodA 時,會遍歷這個類的方法棧,只要發現 methodA 就會中止遍歷,因此天然屌用的就是類別中的 methodA 了。 unicode

2.類別的做用

類別的做用主要有三個:

(1)能夠將類的實現分散到多個不一樣的文件或者不一樣的框架中,方便代碼的管理。也能夠對框架提供類的擴展(沒有源碼,不能修改)。

 (2)建立對私有方法的前向引用:若是其餘類中的方法未實現,在你訪問其餘類的私有方法時編譯器報錯這時使用類別,在類別中聲明這些方法(沒必要提供方法實現),編譯器就不會再產生警告

 (3)向對象添加非正式協議:建立一個NSObject的類別稱爲「建立一個非正式協議」,由於能夠做爲任何類的委託對象使用。

二.Extension 的使用

   首先仍是須要建立相關類的擴展,即方法的聲明,而後在須要擴張的類中引入頭文件,而後實現聲明的方法。

三.Category 與Extension 的區別

1.形式上看:extension 是匿名的category

2.extension中聲明的方法須要在mainimplementation中實現,而category 不作強制要求

3.extension 能夠添加屬性、成員變量,而category 通常不能夠。

相關文章
相關標籤/搜索