類別(Category)['kætiɡəri] n. 種類,分類;範疇
定義:為現有的類添加新方法
一、聲明類別
類別的聲明與類的聲明格式相似,如下:
@interfaceNSString (NumberConvenience)//convenience [kən'vi:njəns]n. 便利;廁所;便利的事物-(NSNumber *) lengthAsNumber;@end
該聲明具有如下特點:
1、現有的類位於@interface關鍵字之後,該方法表示向NSString類中添加一個名稱NumberConvenience的類別。(注意:要保證類別名稱的唯一性)
2、可以添加其他類別的類(本例中是NSString你也可以添加其他類)和方法。別問了以@end結束。
與類的區別:類別中不可以聲明執行個體變數
二、實作類別別
@implementation NSString (NumberConvenience) -(NSNumber *) lengthAsNumber { unsigned int length =[self length]; return ([NSNumber numberWithUnsignedInt:length]); } @end
說明:lengthAsNumber方法通過[self length]來獲得字串長度。
eg:
建立一個新的NSMutableDictionary類的對象並添加一個字串及其長度,分別做鍵和值。
int main(int argc,const char *argv[]) { NSAutoreleasePool *pool; pool=[[NSAutoreleasepool alloc] init]; NSMutableDictionary *dict; dict =[NSMutableDictionary dictionary]; [dict setObject:[@"hello" lengthAdNumber] forKey:@"hello"]; NSLog(@"%@",dict); [pool release]; return (0); }
暫無mac 運行結果(不出bug)為5
三、局限性及作用
局限性:
1、無法向類中添加新的執行個體變數;
2、命名容易起衝突,簡單的說就是類別中的方法名和現有的方法名重名;當衝突時你的類別方法將取代初始方法(類別的優先順序高)
作用:
1、將類的實現分散到多個不同的檔案或多個不同架構中
2、建立對私人方法的前向引用 前向引用聲明不能聲明該類的對象, 也不能在內聯成員函數中使用該類的對象, 只能聲明該類的指標, 引用, 函數形參和傳回型別
3、向對象添加非正式協議
註:非正式協議(interface) oc中的協議跟c#中的介面(interface)區別:c#中介面是強制必須實現的,否則編譯報錯,而obj-c雖然在編譯時間會警告,但是最終能編譯通過。
正式協議(protocal):語義上更強烈一些:要求採用該協議的類,"必須"實現協議中約定的方法