OC中提供了一種與眾不同的方式--Category,可以動態的為已經存在的類添加新的行為(方法),這樣可以保證類的原始設計規模較小,功能增加時再逐步擴展。
在使用Category對類進行擴展時,不需要創建子類,Category使用簡單的方式,實現了類的相關方法的模塊化,把不同的類方法分配到不同的分類文件中。
下面我們通過三個分類例子來看一下如何使用分類:
接著我們上一篇的代碼,下面我們創建一個Student的Test分類,創建過程如下:
注意上面的Student+Test.h和Student+Test.m這兩個文件就是我們為Student類創建的分類文件
Student+Test.h文件
#import "Student.h" @interface Student (Test) - (void)test; @endStudent+Test.m文件
#import "Student+Test.h" @implementation Student (Test) - (void) test { NSLog(@"調用了Student的Test分類的test方法"); } @endmain.m文件
#import運行結果:#import "Student.h" #import "Student+Test.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu = [[[Student alloc] initStudent:23] autorelease]; [stu test]; } return 0; }
2014-11-16 11:32:00.861 內存管理[582:33690] 年齡為23的學生被創建了
2014-11-16 11:32:00.862 內存管理[582:33690] 調用了Student的Test分類的test方法
2014-11-16 11:32:00.862 內存管理[582:33690] 年齡為23的學生被釋放了
分類除了這種寫法其實可以直接寫到Student.h和Student.m中,而不用單獨創建文件。我們也可以給系統的類(NSString)進行分類,比如我們給NSString添加一個處理json的方法。#import@interface NSString (JSON) + (void)json; @end
#import "NSString+JSON.h" @implementation NSString (JSON) + (void) json{ NSLog(@"{'nam':'CodeingSnal', 'age',24"); } @end
分類的使用場景:
1、在定義類的某些情況下(例如需求變更),你可能需要給其中的某個或某幾個類添加新的方法。
2、一個類中包含了許多不同種類的方法需要實現,而這些方法需要不同的團隊的成員實現。
3、在使用基礎類庫的類時,有可能希望這些類實現一些自己需要的方法,比如寫個NSString+JSON.h,為NSString這個類拓展一些解析JSON的方法。