Objective-C 2.0中Category簡明教程
Objective-C 2.0中Category簡明教程是本文要介紹的內容,先來簡單認識一下Category,Category為我們提供了區別于繼承的另外一種方法來對類進行擴展。我們可以向任何已有的類添加成員函數來實現功能上的擴展(注:category只允許添加成員函數,不能添加數據成員),添加的函數可以訪問類中所有的數據成員,該類的子類也將繼承新添加的成員函數。
假設我們需要擴展前面幾節用到的book類,添加一個名為Abstract的成員函數來輸出書籍的摘要。使用category的格式為:
在頭文件中聲明category:
@interface 需要擴展的類(category名稱) //需要添加的函數 @end
可以看到,聲明category的方法同類的聲明非常類似。回到我們的例子,如果我們需要向Book類添加Abstract成員函數,對應的聲明文件如下所示
- // // Book+Abstract.h
- #import <Cocoa/Cocoa.h>
- #import "Book.h"
- @interface Book(Abstract)
- -(NSString*) Abstract;
- end
注意推薦的文件命名規則:類名+category名.h
接下來我們需要對添加的abstract函數進行定義,如下所示:
- // // Book+Abstract.m
- #import "Book+Abstract.h"
- @implementation Book(Abstract)
- -(NSString*)Abstract{
- NSString* retstr = [[NSString alloc]initWithString:@"The story is..."];
- [retstr autorelease]; return retstr; }
- @end
implementation文件的命名規則與頭文件相似:類名+category名.m
作為演示,我們只是在Abstract函數中簡單的輸出一個NSString。下面我們來看客戶端如何調用:
- #import <Foundation/Foundation.h>
- #import "Book.h"
- #import "Book+Abstract.h"
- int main (int argc, const char * argv[]) {
- NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
- NSString* name = [[NSString alloc] initWithString:@"Harry Porter"];
- NSNumber* number = [[NSNumber alloc] initWithInt:100];
- Book *book = [[Book alloc] initWithTitle:name andNumofpages:number];
- [number release]; [name release];
- NSLog(@"Abstract: %@", [book Abstract]);
- [book release]; [pool drain];
- return 0;
- }
為什么對類進行擴展的feature被稱作category?該名稱應該反映了某種初衷,那就是當某個類比較復雜龐大時,我們可以對它的功能(也就是成員函數)進行分類,并且把它們放入不同的文件加以實現。
小結:Objective-C 2.0中Category簡明教程的內容介紹完了,希望通過本文的學習能對你有所幫助!




















