最近在整理項目中用到的公共的方法,要把他們封裝成公共類,碰到了這兩個概念,所以把這個簡單的整理一下:
一、概述
類別是一種為現有的類添加新方法的方式。
利用Objective-C的動態運行時分配機制,Category提供了一種比繼承(inheritance)更為簡潔的方法來對class進行擴展,無需創建對象類的子類就能為現有的類添加新方法,可以為任何已經存在的class添加方法,包括那行沒有源碼的類(如框架類)
二、示例
1、聲明類別
@interface NSString (CategoryDemo)
-(NSNumber*) lengthAsNumber;
@end
2、實現類別
@implementation NSString (CategoryDemo)
-(NSNumber*) lengthAsNumber{
NSUInteger length = [self length];
return ([NSNumbernumberWithUnsignedInt: length]);
}
@end
三、類別的局限性
有兩方面的局限性:
(1)無法想類中添加新的實例變量,類別沒有位置容納實例變量。
(2)名稱沖突,即當類別中的方法與原始方法名字沖突時,類別具有更高優先級。類別方法將完全取代初始方法從而無法在使用初始方法。
四、類別的作用
類別主要有3個作用:
(1)可以將類的實現分散到多個不同文件或多個不同框架中,方便代碼管理,也可以對框架提供類的擴展(沒有源碼,不能修改)
(2)創建對私有方法的前向引用:如果其他類中的方法未實現,在你訪問其他類的私有方法時編譯器報錯這時使用類別,在類別中聲明這些方法(不必提供方法實現)編譯器就不會再產生警告
(3)向對象添加非正式協議:創建一個NSObject的類別稱為"創建一個非正式協議"因為可以作為任何類的委托對象使用。
五、擴展extension
// extension
@interface MyObject(){
int iextension;
}
-(void)testInExtension;// 類的mainimplementation不實現的話,有編譯警告。
@end
六、他們的主要區別:
1、形式來看,extension是匿名的category
2、extension里聲明的方法需要在main implementation中實現,category不強制要求
3、extension可以添加屬性(變量),category不可以。