天天看點

Objective-C分類 (category)和擴充(Extension)

from:http://blog.csdn.net/yhawaii/article/details/6992094

1、分類(category)使用Object-C中的分類,是一種編譯時的手段,允許我們通過給一個類添加方法來擴充它(但是通過category不能添加新的執行個體變量),并且我們不需要通路類中的代碼就可以做到,這點和javascript中使用原型來定義屬性有點類似。

我們可以為一個類建立一個新的方法,而不需要在代碼中編輯類定義。

下面就是定義并使用分類的例子程式,通過下面代碼,我們可以給Object-C中的NSString 添加camelCaseString分類,使用camelCaseString方法,就可以去掉一個字元串中的空格,并将原有空格後的單詞改寫成大寫(即将字元串轉化為駝峰式)。

[cpp]  view plaincopy

  1. #import <Foundation/Foundation.h>  
  2. /* 
  3. 定義分類的過程大緻可分為以下幾個步驟: 
  4.     第一步、建立一個帶有接口的新檔案,即建立已有類 
  5.     第二步、在新檔案中添加需要擴充的方法及方法的實作,即需要添加的分類 
  6.  */  
  7. //NSString 表示将要添加分類的類名稱,該類必須是已存在的。  
  8. //CamelCase 是為類添加的方法名稱。  
  9. //隻能添加方法,不能添加變量。  
  10. //頭檔案命名慣例:ClassName+CategoryName.h  
  11. @interface NSString (CamelCase)  
  12. -(NSString*) camelCaseString;  
  13. @end  
  14. @implementation NSString (CamelCase)  
  15. -(NSString*) camelCaseString  
  16. {  
  17.     //調用NSString的内部方法擷取駝峰字元串。  
  18.     //self指向被添加分類的類。  
  19.     NSString *castr = [self capitalizedString];  
  20.     //建立數組來過濾掉空格, 通過分隔符對字元進行組合。  
  21.     NSArray *array = [castr componentsSeparatedByCharactersInSet:  
  22.                       [NSCharacterSet whitespaceCharacterSet]];  
  23.     //把數組的字元輸出  
  24.     NSString *output = @"";  
  25.     for(NSString *word in array)  
  26.     {  
  27.         output = [output stringByAppendingString:word];  
  28.     }  
  29.     return output;  
  30. }  
  31. int main (int argc, const char * argv[])  
  32.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  33.     NSString *str = @"My name is bill.";  
  34.     NSLog(@"%@", str);  
  35.     str = [str camelCaseString];  
  36.     [pool drain];  
  37.     return 0;  

2、擴充(Extension)你可以這樣了解:擴充就是匿名分類,下面是一個擴充的例子:

[plain]
  1. @interface MyClass : NSObject  
  2. - (float)value;  
  3. @interface MyClass () { //注意此處:擴充  
  4.     float value;  
  5. - (void)setValue:(float)newValue;  
  6. @implementation MyClass  
  7. - (float)value {  
  8.     return value;  
  9. - (void)setValue:(float)newValue {  
  10.     value = newValue;  
  11. @end