from:http://blog.csdn.net/yhawaii/article/details/6992094
1、分類(category)使用Object-C中的分類,是一種編譯時的手段,允許我們通過給一個類添加方法來擴充它(但是通過category不能添加新的執行個體變量),并且我們不需要通路類中的代碼就可以做到,這點和javascript中使用原型來定義屬性有點類似。
我們可以為一個類建立一個新的方法,而不需要在代碼中編輯類定義。
下面就是定義并使用分類的例子程式,通過下面代碼,我們可以給Object-C中的NSString 添加camelCaseString分類,使用camelCaseString方法,就可以去掉一個字元串中的空格,并将原有空格後的單詞改寫成大寫(即将字元串轉化為駝峰式)。
[cpp] view plaincopy- #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;
- }
- int main (int argc, const char * argv[])
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- NSString *str = @"My name is bill.";
- NSLog(@"%@", str);
- str = [str camelCaseString];
- [pool drain];
- return 0;
2、擴充(Extension)你可以這樣了解:擴充就是匿名分類,下面是一個擴充的例子:
[plain]- @interface MyClass : NSObject
- - (float)value;
- @interface MyClass () { //注意此處:擴充
- float value;
- - (void)setValue:(float)newValue;
- @implementation MyClass
- - (float)value {
- return value;
- - (void)setValue:(float)newValue {
- value = newValue;
- @end