標籤:
如果一個協議中定義了某些方法,而某類又實現了該協議,那麼該類必須實現這些方法。換句話說,協議是一組公用的方法聲明,誰實現協議,誰就負責實現這些方法,不然會有黃色警告。協議可以擴充已有協議。協議的關鍵字是protocol,以@protocol開始聲明,以@end結束。在類中實現協議時,只需要在類名後面加個<協議名>,即可。下面 看代碼:
先定義一個協議:eat.h
[plain] view plaincopy
- #import <Foundation/Foundation.h>
-
- @protocol eat <NSObject>//協議eat擴充了協議NSObject.h
- -(void)eat;
- @end
上面擴充的NSObject協議不用實現,因為繼承於NSObject的類已經繼承了對NSObject協議的實現
下面建立一個類:Human.h
[plain] view plaincopy
- #import <Foundation/Foundation.h>
- #import "eat.h"
- @interface Human : NSObject <eat>
-
- @end
Human.m
[plain] view plaincopy
- #import "Human.h"
-
- @implementation Human
- -(void)eat
- {
- NSLog(@"協議中定義的eat");
- }
- @end
在main.m中調用:
[plain] view plaincopy
- #import <Foundation/Foundation.h>
- #import "eat.h"
- #import "Human.h"
- int main(int argc, const char * argv[])
- {
-
- @autoreleasepool {
- Human *human =[[Human alloc] init];
- [human eat];
-
- }
- return 0;
- }
2012-03-18 14:35:29.099 category1[1752:403] 協議中定義的eat
很簡單吧,另外,在新版本的objective-c中,增加了協議的一些可選項,@optional,@required,協議中的方法必須實現,不然會報錯,但是如果以@optional修飾的話便沒有這種限制,預設必須實現的方法其實就相當於以@required修飾,比如上面的代碼,我們可以做出以下修改:
eat.h
[plain] view plaincopy
- #import <Foundation/Foundation.h>
-
- @protocol eat <NSObject>//協議eat擴充了協議NSObject.h
- -(void)eat;
- @optional
- -(void)playGuitar;
- @required
- -(void)sleep;
- @end
這樣的話,sleep方法和eat方法同樣必須實現,而playGuitar方法便可選實現。
ios資訊互動 協議的使用