自己的學習筆記。
協議是多個類共用方法的列表,協議中列出的方法在本類中並沒有相應的實現,而是由別的類實現的這些方法。一個類要遵守一個協議,該類就必須實現特定協議的所有方法(可選方法除外)。協議是一系列方法的列表,任何類都可以聲明自身實現了某一個或一些協議。
定義一個協議需要使用 @protocol 指令,緊跟著是協議的名稱,然後就可以聲明一些方法,在指令 @end 之前的所有方法的聲明都是協議的一部分。下麵是在 NSObject.h 上所定義的 NSCopying 協議的代碼:
1 @protocol NSCopying 2 3 - (id) copyWithZone:(NSZone *) zone; 4 5 @end
如果你的類決定遵守 NSCopying 協議,則必須實現 copyWithZone:方法。通過在@interface 中的一對尖括弧內列出協議的名稱,告訴編譯器你正在遵守一個協議,比如:@interface Test:NSObject <NSObject> 這句代碼的意思是:Test 類的父類是NSObject,並且遵守了 NSCopying 協議。
如果想遵守多個協議,只需要在尖括弧中列出多個協議,並可用“ ,”隔開。比如:@interface Test: NSObject <NSCopying , NSCoding> 。
你也可以自己定義協議,比如:
1 @protocol Fly 2 3 - (void)go; 4 - (void)stop; 5 @optional // 可選的方法,可實現也可不實現 6 - (void)sleep; 7 8 @end
下麵就通過一個例子,來具體說明下協議的用法:
1 #import <Foundation/Foundation.h> 2 3 @protocol Study 4 5 - (void)study; 6 - (void)stop; 7 8 @optional // 可選的方法,此程式中選擇不實現 9 - (void)sleep; 10 11 @end 12 13 @interface Test : NSObject <Study>{ 14 15 } 16 - (void)study; 17 - (void)stop; 18 @end 19 20 @implementation Test 21 22 - (void)study{ 23 NSLog(@"好好學習,天天向上!"); 24 } 25 26 - (void)stop{ 27 NSLog(@"不學習,將很難成功!"); 28 } 29 @end 30 31 int main(int argc , const char *argv[]){ 32 @autoreleasepool { 33 Test *test = [Test new]; 34 35 [test study]; 36 [test stop]; 37 38 if([test conformsToProtocol:@protocol(Study)] == YES) // 判斷是否遵守了協議 39 NSLog(@"遵守了Study協議!"); 40 else 41 NSLog(@"沒有遵守協議!"); 42 } 43 return 0; 44 }
同時,在創建一個新協議的時候,也可以在原有的協議上面擴展,如:@protocol Study1 <Study>。
接下來說明一下協議定義的標準語法,其格式為:
@optional 表明符合該協議的類並不一定要實現方法聲明中的各個方法,@required 是必須要實現的方法。協議類類似一個公共介面,它規定了多個類之間的介面。