Objective-C——Category

Objective-C提供了一種與衆不同的方式——Category,可以動態的爲已經存在的類添加新的行爲。這樣可以保證類的原始設計規模較小,功能增加時再逐步擴展。使用Category對類進行擴展時,不需要訪問其源代碼,也不需要創建子類。Category使用簡單的方式,實現了類的相關方法的模塊化,把不同的類方法分配到不同的分類文件中。

實現起來很簡單,舉例說明。

SomeClass.h
@interface SomeClass : NSObject{
}
-(void) print;
@end

這是類SomeClass的聲明文件,其中包含一個實例方法print。如果想在不修改原始類、不增加子類的情況下,爲該類增加一個hello的方法,只需要簡單的定義兩個文件SomeClass+Hello.h和SomeClass+Hello.m,在聲明文件和實現文件中用“()”把Category的名稱括起來即可。聲明文件代碼如下:

#import "SomeClass.h"

@interface SomeClass (Hello)
-(void)hello;
@end

實現文件代碼如下

#import "SomeClass+Hello.h"
@implementation SomeClass (Hello)
-(void)hello{
    NSLog (@"name:%@ ", @"Jacky");
}
@end 

其中Hello是Category的名稱,用Xcode創建Category,那麼需要填寫的內容包括名稱和要擴展的類的名稱。這裏還有一個約定成俗的習慣,將聲明文件和實現文件名稱統一採用“原類名+Category”的方式命名。
調用也非常簡單,毫無壓力,如下:
首先引入Category的聲明文件,然後正常調用即可。

#import "SomeClass+Hello.h"

SomeClass * sc =[[SomeClass alloc] init];
[sc hello] 

執行結果是:
name:Jacky

Category的使用場景:
1、當在定義類的時候,在某些情況下(例如需求變更),可能想要爲其中的某個或幾個類中添加方法。
2、一個類中包含了許多不同的方法需要實現,而這些方法需要不同團隊的成員實現
3、當在使用基礎類庫中的類時,可能希望這些類實現一些你需要的方法。

遇到以上這些需求,Category可以幫助你解決問題。當然,使用Category也有些問題需要注意,
1、Category可以訪問原始類的實例變量,但不能添加變量,如果想添加變量,可以考慮通過繼承創建子類。
2、Category可以重載原始類的方法,但不推薦這麼做,這麼做的後果是你再也不能訪問原來的方法。如果確實要重載,正確的選擇是創建子類。
3、和普通接口有所區別的是,在分類的實現文件中可以不必實現所有聲明的方法,只要不去調用它。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章