Obj-C中的Protocol和Delegate
一、精典举例:
举个例子,也谈谈我对delegate和protocol的理解。
我上班的工作主要内容包括 (1)写代码(2)写文档(3)测试程序(4)接电话(5)会见客户
(1)(2)我自己全权负责,但是后面(3)(4)(5)我不想或者不方便自己做,所以我想找个助手(delegate)帮我做这些事,于是我定了一个招聘要求(Protocol),里写明我的助手需要会做(3)(4)(5)这三件事。很快,我招到一个助手。
我.delegate = 助手;
于是以后每当我遇到需要测试程序或者接电话的活,我就把他转交给助手(delegate)去处理,助手处理完后如果有处理结果(返回值)助手会告诉我,也许我会拿来用。如果不需要或者没有结果,我就接着做下面的事。
二、一般使用
在someObj的类的实现中,当某事件发生时,代码就是这样的:
- (void) *****omeEvent {
if (self.delegate != nil) {
[self.delegate someMethod];
}
else {
// do nothing
}
}
三、Delegate自定义
>>> 自定义delegate
1.声明协议中的接口,但不实现,例如@protocol DelegateA。
2.在代理类中实现接口(例如一般代理类选为view controller),声明如下,@interface ViewAController:UIViewController <DelegateA>,并且实现DelegateA中的接口。
3.在需要使用这个protocol中方法的类中,声明这个protocol的引用,例如id <DelegateA> delegate,在代理类中DelegateA 将delegate变量指向DelegateA的对象,例如delegate = self;
>>> 系统定义delegate
1.在代理类中实现接口(例如一般代理类选为view controller),声明如下,@interface ViewAController:UIViewController <UITextFieldDelegate>,并且UITextFieldDelegate实现中的接口。
2.在代理类中(例如view controller)声明UITextField *textField;并设置textField.delegate = self;
>>> 自定义delegate和系统定义delegate的区别
1.系统定义的delegate不需要声明一个它的引用,也就是它的代理函数是由系统来调度的,例如点击一下UITextField控件,系统会自动调用到textFieldShouldBeginEditing,而自定义的delegate需要用户去调用,用[delegate functionA]。
>>> 自定义delegate和系统定义delegate的相同点
1.需要在代理类中声明并实现接口。
2.需要设置delegate,通常在代理的类中设置为delegate = self;可见delegate就是一个函数指针。
>>> 自定义delegate的用途
example 1:在不同的两个view之间传值(准确地说,应该是两个view controller之间)
example 2:自定义控件。
四、经典回复
1. 够形象了, 也说明了现象
但是未到本质, 为什么不用1,2,3,4,5 你全部包办阿。 我觉得是因为那些工作不是自己能确定的
火候未到,我还是举个代码的例子吧。
UITableView, SDK提供的标准控件,这个代码是苹果写的,SDK使用者都要用,苹果写代码的时候当然不知道每一个人怎么用这个tablieview的,比如说选中了tableview的一行, 对开发者自己的程序表示什么,要执行什么动作。这个只有开发者自己才知道, 使用了 delegate 之后, 开发者只要实现下面这个接口。
– tableView:didSelectRowAtIndexPath:
这是降低代码耦合的常用方法, c/c++ 中叫callback, delegate 应该可以看做比较OO的callback实现
2. 代理本质上就是设计模式中的“观察者模式”。
五、我的理解
protocol ——> 侧重定义接口方法。
delegate ——> 主要为相关接口方法的主动调用提供方式。