在編寫面向對象程序的時候,咱們常常想爲現有的類添加一些新的行爲。有些時候,咱們能夠建立這個類的子類。可是,若是咱們用到工具集或者類庫的時候,沒法處理新建的子類。這時,Objective-C就給咱們提供了一個很是方便好用的方式 —— 類別(category)。編程
那麼,什麼是類別呢?類別是一種爲現有的類添加新方法的方式。你只須要知道這個類的公開接口,不須要知道類的源代碼。並且能夠將類定義模塊化地分佈到多個相關文件中。ide
類別一樣由聲明部分和實現部分組成,聲明部分語法格式以下:模塊化
1 @interface 已經存在的類名 (類別名) 2 // 方法定義 3 ... 4 @end
類別實現部分的語法格式以下:函數
1 @implmentation 已經存在的類名 (類別名) 2 // 實現方法代碼 3 ... 4 @end
類別是Objective-C中一個很是重要的知識,它一般有以下3種用法:工具
1). 利用類別對類進行模塊化設計;
2). 使用類別來調用私有方法;
3). 使用類別來實現非正式協議。 測試
下面,咱們經過一個例子,給你們展現下如何來使用類別這個方式。就編程習慣而言,通常習慣將類別的接口文件名命名爲「類名+類別名.h」的形式,實現部分文件則命名爲「類名+類別名.m」。spa
首先,咱們建立一個名爲:NSNumber+Calculate的類文件。建立好類文件,項目中會自動生成兩個文件:設計
接下來,咱們就分別來寫接口文件和實現文件的代碼。code
1 // 2 // NSNumber+Calculate.h 3 // 4 5 #import <Foundation/Foundation.h> 6 7 @interface NSNumber(Calculate) 8 // 在類別中定義了4個方法 9 -(NSNumber*) add: (double) num2; 10 -(NSNumber*) substract: (double) num2; 11 -(NSNumber*) multiply: (double) num2; 12 -(NSNumber*) divide: (double) num2; 13 @end
實現部分代碼:對象
1 // 2 // NSNumber+Calculate.m 3 // 4 5 #import "NSNumber+Calculate.h" 6 7 @implementation NSNumber(Calculate) 8 // 實現類別的接口部分定義的4個方法 9 -(NSNumber*) add: (double) num2 10 { 11 return [NSNumber numberWithDouble:([self doubleValue] + num2)]; 12 } 13 -(NSNumber*) substract:(double)num2 14 { 15 return [NSNumber numberWithDouble:([self doubleValue] - num2)]; 16 } 17 -(NSNumber*) multiply: (double) num2 18 { 19 return [NSNumber numberWithDouble:([self doubleValue] * num2)]; 20 } 21 -(NSNumber*) divide: (double) num2 22 { 23 return [NSNumber numberWithDouble:([self doubleValue] / num2)]; 24 } 25 @end
最後,在main主函數中調用定義的方法,來測試下咱們定義的類別方法是否能正常實現。
1 // 2 // main.m 3 // 4 5 #import <Foundation/Foundation.h> 6 #import "NSNumber+Calculate.h" 7 8 int main(int argc, const char * argv[]) 9 { 10 11 @autoreleasepool { 12 NSNumber* myNum = [NSNumber numberWithInt:3]; 13 // 測試 add方法 14 NSNumber* add = [myNum add:2.4]; 15 NSLog(@"Add: %@", add); 16 // 測試 substract方法 17 NSNumber* substract = [myNum substract:2.4]; 18 NSLog(@"Add: %@", substract); 19 // 測試 multiply方法 20 NSNumber* multiply = [myNum multiply:2.4]; 21 NSLog(@"Add: %@", multiply); 22 // 測試 divide方法 23 NSNumber* divide = [myNum divide:2.4]; 24 NSLog(@"Add: %@", divide); 25 } 26 return 0; 27 }
正常運行後的結果以下:
雖然類別能夠重寫原有類中的方法,但一般不推薦這麼作。若是須要重寫原類的方法,更好的建議是經過原有類的派生類,而後再子類中重寫父類的原有方法來實現。
經過類別爲指定類添加新方法以後,這個新方法不只會影響NSNumber類,還會影響NSNumber類的全部子類,每一個子類都會獲取類別擴展的方法。同時,能夠根據須要,爲一個類定義多個類別,不一樣的類別均可以對原有的類添加方法定義。
好了,類別的概念和基本的使用方法就介紹這麼多。下一篇博文,咱們將介紹另外幾個在Objective-C中很是重要的:協議和委託。