category 類別 extension擴展

一 category

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

利用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]);

}

@end

 

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 

下面是extension和category的語法示例:

// extension

@interface  MyObject(){

    int iextension;

}

-(void)testInExtension;// 類的mainimplementation不實現的話,有編譯警告。

@end

// category

@interface   MyObject(categoryDemo){

    //   int icategory;   // error: Ivarsmay not be placed in categories

}

-(void)testInCategory;// 不強制要求在類的mainimplementation中實現

@end

Extension耦合比較高,聲明能夠單獨寫,可是實現必須寫在原有類的@implementation中。能夠增長Method和instance variable。

Extension給人感受更像是在編寫類時爲了封裝之類的特性而設計,和類是同時編寫的。而category則是在用到某一個framework中的類時臨時增長的特性。

Extension的一個特性就是能夠redeclare一個instance variable,將之從readonly改成對內readwrite.

他們的主要區別是:

1、形式上來看,extension是匿名的category

2extension裏聲明的方法須要在mainimplementation中實現,category不強制要求。這點從系統生成的類也能看出來,category直接生成.h和.m文件。而extension只生成一個.h文件,告訴你,實現去原類裏面。

3extension能夠添加屬性(變量),category不能夠。

相關文章
相關標籤/搜索