類別是一種爲現有的類添加新方法的方式。 框架
利用Objective-C的動態運行時分配機制,Category提供了一種比繼承(inheritance)更爲簡潔的方法來對class進行擴展,無需建立對象類的子類就能爲現有的類添加新方法,能夠爲任何已經存在的class添加方法,包括那些沒有源代碼的類(如某些框架類). spa
2、示例 .net
1、聲明類別 設計
@interface NSString (CategoryDemo) 對象
-(NSNumber*) lengthAsNumber; 繼承
@end get
2、實現類別 編譯器
@implementation NSString (CategoryDemo) 源碼
-(NSNumber*) lengthAsNumber{ it
NSUInteger length = [self length];
return ([NSNumbernumberWithUnsignedInt: length]);
}
3、調用:(#import頭文件)
NSMutableDictionary *dic =[NSMutableDictionarydictionary];
[dicsetObject: [@"Hello"lengthAsNumber]forKey:@"hello"];
[dic setObject: [@"World!" lengthAsNumber] forKey: @"world"];
NSLog(@"%@", dic);
4、打印結果:
2012-07-27 17:43:32.993CategoryDemo[2193:f803] {
hello = 5;
world = 6;
}
3、類別的侷限性
有兩方面侷限性:
(1)沒法向類中添加新的實例變量,類別沒有位置容納實例變量。
(2)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具備更高的優先級。類別方法將徹底取代初始方法從而沒法再使用初始方法。
4、類別的做用
類別主要有3個做用:
特:之前用的類某個方法有BUG。那麼用category重寫該方法。
(1)能夠將類的實現分散到多個不一樣文件或多個不一樣框架中,方便代碼管理。也能夠對框架提供類的擴展(沒有源碼,不能修改)。
(2)建立對私有方法的前向引用:若是其餘類中的方法未實現,在你訪問其餘類的私有方法時編譯器報錯這時使用類別,在類別中聲明這些方法(沒必要提供方法實現),編譯器就不會再產生警告
(3)向對象添加非正式協議:建立一個NSObject的類別稱爲「建立一個非正式協議」,由於能夠做爲任何類的委託對象使用
下面是extension和category的語法示例:
// extension
@interface MyObject(){
int iextension;
}
-(void)testInExtension;// 類的mainimplementation不實現的話,有編譯警告。
// category
@interface MyObject(categoryDemo){
// int icategory; // error: Ivarsmay not be placed in categories
}
-(void)testInCategory;// 不強制要求在類的mainimplementation中實現
Extension耦合比較高,聲明能夠單獨寫,可是實現必須寫在原有類的@implementation中。能夠增長Method和instance variable。
Extension給人感受更像是在編寫類時爲了封裝之類的特性而設計,和類是同時編寫的。而category則是在用到某一個framework中的類時臨時增長的特性。
Extension的一個特性就是能夠redeclare一個instance variable,將之從readonly改成對內readwrite.
他們的主要區別是:
1、形式上來看,extension是匿名的category。
2、extension裏聲明的方法須要在mainimplementation中實現,category不強制要求。這點從系統生成的類也能看出來,category直接生成.h和.m文件。而extension只生成一個.h文件,告訴你,實現去原類裏面。
3、extension能夠添加屬性(變量),category不能夠。