iOS中的協議說白了就是方法的聲明,只聲明不需要實現,實現的部分由遵守協議方完成.
先看個協議的小例子:這個例子是先給出兩個協議,再創建兩類人遵守協議.
流氓協議(RogueDelegate.h)
#import <Foundation/Foundation.h> /**流氓協議*/ @protocol RogueDelegate <NSObject> @required // 必須實現的方法 /**吃*/ - (void) eat; /**騙*/ - (void) lie; @optional // 可選實現的方法 - (void) drink; @end
君子協議(GentleDelegate.h)
/**君子協議*/ @protocol GentleDelegate <NSObject> // 協議內容只能有方法不能有屬性 // 協議方法 /**動口不動手*/ - (void) fight; /**愛錢取之有道*/ - (void) loveMoney; @end
遵守協議的對象
#import <Foundation/Foundation.h> #import "RogueDelegate.h" #import "GentleDelegate.h" // 遵守協議的類就是代理類; 如果一個類遵守了協議, 就要去實現協議方法; /**遵守流氓協議的代理*/ // 一個類可以同時遵守多個協議, 在一個<>中多個協議名用逗號隔開 @interface YHPerson : NSObject <RogueDelegate, GentleDelegate> @end @interface YHStudent : NSObject <RogueDelegate> - (void) study; @end
實現協議
#import "YHPerson.h" @implementation YHPerson - (void) eat { NSLog(@"正在吃霸王餐!!"); } - (void) lie { NSLog(@"在撒謊!!"); } - (void) fight { NSLog(@"動口不動手!!"); } - (void) loveMoney { NSLog(@"愛錢取之有道!!"); } @end @implementation YHStudent // 實現學生相關的方法 - (void) study { NSLog(@"Good Good Study, Day Day Up."); } // 實現流氓協議的方法 - (void) eat { NSLog(@"吃完帶搶"); } - (void) lie { NSLog(@"處處留情!!"); } @end
協議中的概念
委托:就是委托別人干事的一方,指定協議的一方
代理:接受委托的一方;具體做事的,實現協議的一方
協議:代理方做事的守則,也就是代理方需要實現方法的申明
協議的特點:1.一個類可以遵守多個協議(就好像一個公司可以為多家公司服務一樣)
2.同一個協議可以被多個類遵守(就好像一個公司可以由多個公司提供服務一樣)
一個類遵守了什么協議,就要實現這個協議規定的方法
下面在各以各具體的事例:老板想要做一個iOS項目,但是自己不會做, 找一個會iOS開發的人來幫他做
在YHBoss.h文里聲明協議,聲明委托屬性,並實現委托代理方法
#import <Foundation/Foundation.h> //2.協議 /**聲明協議*/ @protocol StaffDelegate <NSObject> /**會IOS開發(做開發)*/ - (void) codeIOS; @end // 1. 委托 // 委托需要一個遵守協議的對象來幫他做事情 (委托需要一個代理) /**委托類(制定協議)*/ @interface YHBoss : NSObject // 任何遵守協議的類創建的對象都可以作為老板的代理 // 注意: delegate要用weak修飾(防止循環引用造成對象不能銷毀) /**代理*/ @property (nonatomic, weak) id <StaffDelegate> delegate; // 委托代理方法(告訴代理何時去做事情) /**告訴代理*/ - (void) askStaffWorking; @end
在YHBoss.m文件里實現委托代理方法
#import "YHBoss.h" @implementation YHBoss //委托告訴代理做事 - (void) askStaffWorking { NSLog(@"老板告訴員工開工"); // 代理開始做事情 [self.delegate codeIOS]; } @end
在員工YHPerson.h文件里遵守協議
#import <Foundation/Foundation.h> #import "YHBoss.h" // 3.代理(遵守協議, 實現協議方法) /**代理*/ @interface YHPerson : NSObject <StaffDelegate> @end
在員工YHPerson.m文件里實現代理方法
#import "YHPerson.h" #import "YHBoss.h" @implementation YHPerson // 判斷一個對象是否實現了某個方法 // (這里判斷self.delegate是否實現了buyPhone方法) if ([self.delegate respondsToSelector:@selector(codeIOS)]) { // 代理開始做事情 [self.delegate codeIOS]; } @end
在main.文件中創建boss對象和員工對象,讓員工對象成為老板對象的代理在老板要求員工工作的時候,員工實現協議中的方法
#import <Foundation/Foundation.h> #import "YHPerson.h" int main(int argc, const char * argv[]) { @autoreleasepool { // 1.首先需要一個boss YHBoss *boss = [[YHBoss alloc] init]; // 2.需要一個員工 YHPerson *person = [[YHPerson alloc] init]; // 3.讓員工成為老板的代理 boss.delegate = person; // 4.老板喊開工 [boss askStaffWorking]; } return 0; }
在實際開發中協議代理的作用:傳值(反向)和回調.下篇文章中細說.