iOS开发上对delegate使用普遍。
记在这里,若是有新人Google到了,但愿能有点帮助。设计模式
protocol和delegate彻底不是一回事,放在一块儿说,只是由于咱们常常在同一个头文件里看到这两个word。函数
protocol和java里interface的概念相似,是Objective-C语法的一部分。
定义protocol以下spa
@protocol ClassADelegate - (void)methodA; - (void)methodB; @end |
那么就是定义了一组函数,这组函数放在一块儿叫做一个protocol,也就是协议。设计
函数是须要被实现的,因此若是对于class以下code
@interface ClassB <ClassADelegate> { } @end |
就叫做ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议,
也就是实现了这一组函数。orm
有了上面这个头文件,咱们就能够放心做调用开发
ClassB *b = [[ClassB alloc] init]; [b methodA]; [b methodB]; |
而不用担忧出现unrecognized selector sent to instance这种错误了。源码
因此protocol就是一组函数定义,是从类声明中剥离出来的一组定义。
id<ClassADelegate> b = ...; [b methodA]; |
这种用法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。
那么delegate是什么?其实和protocol没有关系。Delegate自己应该称为一种设计模式。
是把一个类本身须要作的一部分事情,让另外一个类(也能够就是本身自己)来完成。
好比ClassC
@interface ClassC { id delegate; } @end |
那么ClassC的实现(.m文件)里就能够用delegate这个变量了。
固然这里彻底能够用其它名字而不是delegate。
咱们也能够这样写
@interface ClassC { ClassB *delegate; } @end |
这样咱们知道了delegate是一个ClassB,它就能够提供ClassB里的方法。
能够把一部分ClassC里的工做放在ClassB里去实现。
这样的写法看起来是否是有点奇怪?或者应该写成这样?
@interface ClassC { ClassB *classB; } @end |
.....
delegate没有了...
因此说其实delegate只是一种模式,你们约定俗成,当把本身内部一部分实现暴露给另一个类去作的时候,就叫实际作事的类为delegate。
为何会须要把内部实现提出来给另外一个类作呢?
最多见的目的就是为了在隐藏实现的前提下,提供一个自定义的机会。
好比Apple提供的iOS SDK里就有众多的delegate,好比最经常使用的UITableView,
咱们无法知道Apple怎么重用UITableViewCell,怎么处理UITableView里Cell的增长、删减,由于咱们没有源码。
可是咱们能够经过实现Delegate的方法来控制一个UITableView的一些行为。
UITableViewDataSource其实和delegate是同样同样的,只是因为意义不一样换了个名字罢了。
protocol在此扮演了什么角色呢?
protocol是一种语法,它提供了一个很方便的、实现delegate模式的机会。
好比写UITableView的时候,Apple这么干
UITableView.m
- (void)doSomething { [self blahblah]; [self.delegate guruguru]; [self blahblah]; } |
delegate是咱们写的类,这个类若是能够被传给UITableView作为其delegate,那惟一要求,就是它实现了
- (void)guruguru; |
这个方法。
若是咱们把这个方法定义在一个protocol里
@protocol XXXProtocol - (void)guruguru; @end |
就说明了,UITableView须要的delegate是一个conform to XXXProtocol的类。
这就正好是
id<XXXProtocol> |
表达的意思。
不管具体的类是什么,它还有其它什么方法,只要它conform to这个protocol,
就说明它能够被传给UITableView,做为它的delegate。
那么Apple为了让咱们知道这个protocol是delegate须要conform的protocol,
它就把XXXProtocol改为了UITableViewDelegate
这样咱们看到protocol的名字里有Delegate,就知道这个protocol里的函数是用来作自定义(Customization)的了。
代码最终仍是给人看的,公司里尤为如此。
你们都但愿对方把事情讲得清晰易懂,若是在再有两句俗语或者行话那你们就很开心了 :]
结论:protocol 是一种语法。delegate 是一种设计模式。delegate不过是对一种协议使用方法的命名。相似的状况还有datasource。其实本质都是利用协议实现。