Objective-C 類別(Category)淺談

Objective-C提供了一個非常靈活的類(Class)擴展機制-類別(Category)。類別用於對一個已經存在的類添加方法(Methods)。你只需要知道這個類的公開接口,不需要知道類的源代碼。需要注意的是,類別不能爲已存在的類添加實例變量(Instance Variables)。

類別的基本語法如下:
@interface ClassName(CategoryName)
//method declarations
@end
@interface 類名(類別名)
類別方法申明
@end
類別的語法與類的語法非常相似。類別的方法就是類的方法。類別的定義可以放在一個單獨的文件中("類別名.h"), 也可以放在一個已存在的類的定義文件中(.h文件)。類別的實現則可放在一個單獨的“類別名.m”文件中,或另一個類的實現文件中。這點也與類的定義相似。因爲類別的方法就是類的方法,所以類別的方法可以自由引用類的實例變量(無論公有或私有)。

子類(subclassing)是進行類擴展的另一種常用方法。與子類相比,類別最主要的優點是:系統中已經存在的類可以不需修改就可使用類別的擴展功能。例如,假設系統中存在一個類A;另外一個類B中定義了一個類A類型的實例變量,幷包含了類A的頭文件“#import <A.h>"。假設一段時間後,需要對類A擴展幾個新的方法。如果用子類,就需要創建一個子類A-1。如果類B想要使用類A的新方法,就要進行如下修改:1) 將包含的頭文件改爲"#import<A-1.h>"; 2)將所有用到的類A對象改爲類A-1的對象。可以想象,如何有很多類需要用到類A的新功能(比如類A是iOS中的類UIViewController),隨着系統的升級(iOS從1.0到5.0),你的程序需要不停地進行這種繁瑣地修改。如果使用類別,即使類A升級了,系統中其它的類可以不需任何修改,直接就可以調用類A的新方法。 

類別的第二大優點是實現了功能的局部化封裝。類別定義可以放在一個已存在的類(類A)的定義文件中(.h)。這意味着這個類別只有在類A被引用的前提下才會被外部看到。如果另一個類(類B)不需要用到類A的功能(沒有包含類A的.h文件),也就不會看到依附類A存在的類別。iOS SDK中廣泛運用這種類別定義法來封裝功能。例如,在 UINavigationController.h中定義了專爲UINavigationController擴展的UIViewController類別:

@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationItem *navigationItem; 
@property(nonatomic,readonly,retain) UINavigationController *navigationController; 
......
@end
如果一個類不引用UINavigationController.h,也就不會看到navigationItemnavigationController這兩個性質申明(declared property)。

類別的另一個優點是輕巧(light-weight)。很多時候,對已存在的類所需的擴展僅僅是幾個新方法。這時,用類別避免了在系統中留下很多非常短小的“微”子類,使程序更加緊湊。
發佈了20 篇原創文章 · 獲贊 8 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章