1. 程式人生 > >iOS中的分類和擴充套件

iOS中的分類和擴充套件

一、什麼是分類?

概念:分類(Category)是OC中的特有語法,它是表示一個指向分類的結構體指標。根據下面原始碼組成可以看到它沒有屬性列表,原則上是不能新增成員變數(其實可以藉助執行時功能,進行關聯),只能增加方法。

typedef struct objc_category *Category;
struct objc_category {
char *category_name OBJC2_UNAVAILABLE; // 分類名
char *class_name OBJC2_UNAVAILABLE; // 分類所屬的類名
struct objc_method_list *instance_methods OBJC2_UNAVAILABLE; //
例項方法列表 struct objc_method_list *class_methods OBJC2_UNAVAILABLE; // 類方法列表 struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 分類所實現的協議列表 }

分類的宣告:

@interface 類名(分類名)
方法的宣告;
...

@end

 

分類的實現:

@interface 類名(分類名)
方法的實現;
...

@end

 

作用:主要作用是為已經存在的類新增方法。在不改變原有類的前提下,動態地給這個類新增一些方法。

注意:

1.分類是用於給原有類新增方法的,因為分類的結構體指標中,沒有屬性列表,只有方法列表。

2.分類中可以寫@property,但不會生成setter/getter方法,也不會生成實現以及私有的成員變數;

3.可以在分類中訪問原有類中公開屬性。

4.如果分類中有和原有類同名的方法,會優先呼叫分類的方法,會忽略原有類的方法。因此在開發中儘量不要覆蓋原有類的方法。

5.如果多個分類與原有類,或者多個分類有分類間有相同的方法名,那麼呼叫該方法的時候執行誰由編譯器決定;編譯器會執行最後一個參與編譯的分類中的方法。

二、什麼是擴充套件?

概念:Extension是Category的一個特例。類擴充套件與分類相比只少了分類的名稱,所以稱之為“匿名分類”。其實開發當中,我們幾乎天天在使用。對於有些人來說像是最熟悉的陌生人。

類擴充套件的格式:

@interface XXX()

私有屬性;
私有方法;(如果不實現,編譯時會報警告,Method definition for 'XXX' not found)

@end

 

作用:為一個類新增額外的原有類沒有的變數,方法和屬性;一般的類擴充套件寫到.m檔案中;一般私有屬性寫到.m檔案的類擴充套件中。

 

注意:類擴充套件中新增的新方法,一定要實現。Category中沒有這種限制。

三,分類與擴充套件的區別

1.類別中原則上只能增加方法(能新增屬性的原因只是通過runtime解決setter/getter的問題而已);

2.類擴充套件不僅可以增加方法,還可以增加例項變數(或者屬性),只是改例項變數預設是@private型別的;

3.類擴充套件中宣告的方法沒被實現,編譯器會報警,但是類別中的方法沒被實現的編譯器不會報警的。因為類擴充套件是在編譯階段新增到類中,而類別是在執行時新增到類中。

4.類擴充套件不能像類別那樣擁有獨立的實現部部分(@implement部分),類擴充套件所宣告的方法必須依託對應類的實現部分來實現。

5.定義在.m檔案中的類擴充套件方法為私有的,定義在.h檔案(標頭檔案)中的檔案擴充套件方法為公有的。