Category和Extension

轉: http://blog.csdn.net/leikezhu1981/article/details/19091049框架

1、概述.net

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

利用Objective-C的動態運行時分配機制,Category提供了一種比繼承(inheritance)更爲簡潔的方法來對class進行擴展,無需建立對象類的子類就能爲現有的類添加新方法,能夠爲任何已經存在的class添加方法,包括那些沒有源代碼的類(如某些框架類)。blog

 

2、示例繼承

一、聲明類別get

@interface NSString (CategoryDemo)編譯器

-(NSNumber*) lengthAsNumber;源碼

@endit

 

二、實現類別io

@implementation NSString (CategoryDemo)

-(NSNumber*) lengthAsNumber{

   

    NSUInteger length = [self length];

    return ([NSNumbernumberWithUnsignedInt: length]);

}

@end

 

三、調用:

NSMutableDictionary *dic =[NSMutableDictionarydictionary];

[dicsetObject: [@"Hello"lengthAsNumber]forKey:@"hello"];

[dic setObject: [@"World!" lengthAsNumber] forKey: @"world"];

NSLog(@"%@", dic);

 

四、打印結果:

2012-07-27 17:43:32.993CategoryDemo[2193:f803] {

    hello = 5;

    world = 6;

}

 

3、類別的侷限性

有兩方面侷限性:

(1)沒法向類中添加新的實例變量,類別沒有位置容納實例變量。

(2)名稱衝突,即當類別中的方法與原始類方法名稱衝突時,類別具備更高的優先級。類別方法將徹底取代初始方法從而沒法再使用初始方法。

 

4、類別的做用

類別主要有3個做用:

(1)能夠將類的實現分散到多個不一樣文件或多個不一樣框架中,方便代碼管理。也能夠對框架提供類的擴展(沒有源碼,不能修改)。

(2)建立對私有方法的前向引用:若是其餘類中的方法未實現,在你訪問其餘類的私有方法時編譯器報錯這時使用類別,在類別中聲明這些方法(沒必要提供方法實現),編譯器就不會再產生警告

(3)向對象添加非正式協議:建立一個NSObject的類別稱爲「建立一個非正式協議」,由於能夠做爲任何類的委託對象使用。

 

 

4、擴展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

 

// implementation

@implementation MyObject

//

//-(void)testInExtension{

//

//}

//

//-(void)testInCategory{

//

//}

@end

他們的主要區別是:

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

二、extension裏聲明的方法須要在mainimplementation中實現,category不強制要求。

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

相關文章
相關標籤/搜索