开始讲之前,我们先来看一下这两个单词的意思。
protocol - n. 协议;草案;礼仪
delegate - n. 委托;代表;代理
我们称呼protocol为协议,delegate为代理(也有人称之为委托)
-
要搞明白协议和代理,我们首先要知道,它们解决了什么问题。
先讲一个小故事帮助大家理解。
工作分工老王开了一家公司,刚开始规模很小,所以老王一个人做所有的事情:接活、干活、交工。(从甲方那里接活,自己做完,然后交给甲方)但是后面随着规模的扩大,老王一个人就吃不消了,忙死也忙不过来了。这时候怎么办?大家都很清楚吧,招人呗!所以后面就有了小曹、小刘、小张。
这就意味着原先老王的工作按模块进行了拆分。
转换成编程世界的模型就是这样的:业务不是很复杂的时候,我们把所有的功能都写在一个类里面,这个类暂且叫老王,理论上所有的事情和功能都可以写到这个类里面。接活方法,干活方法,交工方法......就造成了老王这个类非常的庞大和臃肿,并且容易出错。
我们招了小曹、小刘、小张,新建了小曹类、小刘类、小张类,小曹类有接活方法,小刘类有干活方法,小张类有交工方法。
仅仅这样还是不行的,因为模块开发必然就有模块分化以后模块之间的通信问题。小曹类只接活 但是接到活之后怎么办,必须及时的干活。但是小曹不能干活,所以小曹必须抛出接到活的信号,具体这个活怎么干,就不是小曹关心的了。
以上,就是协议和代理可以解决的问题,也是协议和代理出现的意义。
-
协议和代理是怎么使用的。
老王与小曹约定,你只管接活,我一个月给你100元,项目完成之后,给你们提成。
小曹、小刘、小张互相不认识,为了多拿提成,都与老王约定,小曹干完活马上就通知老王,老王立刻通知小刘开始干活,小刘干完之后,马上通知老王,老王立刻通知小张开始干活。
这个约定,就是协议(protocol),是双方都要遵守的规则。
smallCao.h
@protocol GetWorkDelegate <NSObject>
- (void)doSomethingAfterGetWork;
@end
@interface smallCao : UIViewController
/**
* delegate 是smallCao类的一个属性,weak 关键字是为了避免循环引用,<GetWorkDelegate>表示遵守DaChuDelegate协议
*/
@property (nonatomic, weak) id <GetWorkDelegate> delegate;
- (void)StartGetWork;
@end
smallCao.m
- (void)StartGetWork {
NSLog(@"我开始接活了");
sleep(2);
NSLog(@"我接到活了");
/**
* 下面这句是判断 一下delegate是否实现了doSomethingAftercaiZuohaole方法
* 如果delegate没有实现,直接[self.delegate doSomethingAfterGetWork],会crash
*/
if ([self.delegate respondsToSelector:@selector(doSomethingAfterGetWork)]) {
[self.delegate doSomethingAfterGetWork];
}
}
下面看一看老王MrWang这个类里面的内容
#import "MrWang.h"
#import "smallCao.h"
#import "smallLiu.h"
#import "smallZhang.h"
@interface MrWang () <GetWorkDelegate,GetDoDelegate>
@end
@implementation MrWang
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"老王新公司成立");
smallCao *xiaoCao = [[smallCao alloc] init];
xiaoCao.delegate = self; //说明老王充当代理的角色,负责接收到小曹发过来的信号,然后立刻通知小刘
[xiaoCao StartGetWork]; //小曹去接活
}
- (void)doSomethingAfterGetWork {
smallLiu *xiaoLiu = [[smallLiu alloc] init];
xiaoLiu.delegate = self;
[xiaoLiu StartDoWork];
}
现在,大家对于协议(protocol)和代理(delegate)的使用,明白了吧!
网友评论