iOS 协议 protocol
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; }
在实际开发中协议代理的作用:传值(反向)和回调.下篇文章中细说.