1、類別(category)
使用Object-C中的分類,是一種編譯時的手段,允許我們通過給一個類新增方法來擴充它(但是通過category不能新增新的例項變數),並且我們不需要訪問類中的程式碼就可以做到,這點和javascript中使用原型來定義屬性有點類似。
我們可以為一個類建立一個新的方法,而不需要在程式碼中編輯類定義。
下面就是定義並使用分類的例子程式,通過下面程式碼,我們可以給Object-C中的NSString 新增camelCaseString分類,使用camelCaseString方法,就可以去掉一個字串中的空格,並將原有空格後的單詞改寫成大寫(即將字串轉化為駝峰式)。
#import <Foundation/Foundation.h> /* 定義分類的過程大致可分為以下幾個步驟: 第一步、建立一個帶有介面的新檔案,即建立已有類 第二步、在新檔案中新增需要擴充套件的方法及方法的實現,即需要新增的分類 */ //NSString 表示將要新增分類的類名稱,該類必須是已存在的。 //CamelCase 是為類新增的方法名稱。 //只能新增方法,不能新增變數。 //標頭檔案命名慣例:ClassName+CategoryName.h @interface NSString (CamelCase) -(NSString*) camelCaseString; @end @implementation NSString (CamelCase) -(NSString*) camelCaseString { //呼叫NSString的內部方法獲取駝峰字串。 //self指向被新增分類的類。 NSString *castr = [self capitalizedString]; //建立陣列來過濾掉空格, 通過分隔符對字元進行組合。 NSArray *array = [castr componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet]]; //把陣列的字元輸出 NSString *output = @""; for(NSString *word in array) { output = [output stringByAppendingString:word]; } return output; } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSString *str = @"My name is bill."; NSLog(@"%@", str); str = [str camelCaseString]; NSLog(@"%@", str); [pool drain]; return 0; }
2、擴充套件(Extension)
你可以這樣理解:擴充套件就是匿名分類,下面是一個擴充套件的例子:
@interface MyClass : NSObject - (float)value; @end @interface MyClass () { //注意此處:擴充套件 float value; } - (void)setValue:(float)newValue; @end @implementation MyClass - (float)value { return value; } - (void)setValue:(float)newValue { value = newValue; } @end