轉: 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不能夠。