協議的作用類似地C++中對抽象基類的多重繼承。類似於Java中的介面(interface)的概念。
協議是多個類共用方法的列表,協議中列出的方法在本類中並沒有相應實現,而是別的類來實現這些方法。
如果一個類要遵守一個協議,該類就必須實現特定協議的所有方法(可選方法除外).
定義一個協議需要使用@protocol指令,緊跟著的是協議名稱,然後就可以聲明一些方法,在指令@end之前的所有方法的聲明都是協議的一部分。如下:
@protocol NSCopying-(id) copyWithZone:(NSZone*) zone;@end
如果你的類決定遵守NSCopying協議,則必須實現copyWithZone方法。通過在@interface中的一對角括弧內列出協議的名稱,告訴編譯你正在遵守一個協議,比如:
@interface Test:NSObject <NSCopying>
執行個體:
Fly.h
#import <Foundation/Foundation.h>@protocol Fly -(void) go; -(void) stop;@optional -(void)sleep;@end
FlyTest.h
#import <Foundation/Foundation.h>#import "Fly.h"@interface FlyTest:NSObject<Fly> {}@end
FlyTest.m
#import "FlyTest.h"@implementation FlyTest-(void) go { NSLog(@"go");}-(void) stop { NSLog(@"stop");}@end
test.m
#import <Foundation/Foundation.h>#import "FlyTest.h"int main( int argc, char* argv[]){ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; FlyTest *flytest = [[FlyTest alloc]init]; [flytest go]; [flytest stop]; [flytest release]; [pool drain]; return 0;}
程式運行結果如下:
go
stop
@protocol的標準文法是:
@protocol 協議名<其它協議, …>
方法聲明1
@optional
方法聲明2
@required
方法聲明3
…
@end
@optional表明該協議的類並不一定要實現方法。
@required是必須要實現的方法。