Obj-C中的Protocol和Delegate

Obj-C中的Protocol和Delegate——内容精选自CocoaChina提问贴:http://www.cocoachina.com/bbs/read.php?tid=48957

一、精典举例:
举个例子,也谈谈我对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 ——> 主要为相关接口方法的主动调用提供方式。

原文链接: https://www.cnblogs.com/sesexxoo/archive/2012/08/30/6189982.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    Obj-C中的Protocol和Delegate

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/61297

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午9:56
下一篇 2023年2月9日 上午9:56

相关推荐