文档章节

[iOS]delegate和protocol

Orange1
 Orange1
发布于 2012/09/29 09:39
字数 1144
阅读 1K
收藏 8


今天上班和同事讨论工程怎么组织的时候涉及到这个话题。
iOS开发上对delegate使用广泛。
记在这里,如果有新人Google到了,希望能有点帮助。

protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。

protocol和java里interface的概念类似,是Objective-C语法的一部分。
定义protocol如下

那么就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。

函数是需要被实现的,所以如果对于class如下

就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议,
也就是实现了这一组函数。

有了上面这个头文件,我们就可以放心作调用

而不用担心出现unrecognized selector sent to instance这种错误了。

所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。

这种用法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。

那么delegate是什么?其实和protocol没有关系。Delegate本身应该称为一种设计模式。
是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。
比如ClassC

那么ClassC的实现(.m文件)里就可以用delegate这个变量了。
当然这里完全可以用其它名字而不是delegate。

我们也可以这样写

这样我们知道了delegate是一个ClassB,它就可以提供ClassB里的方法。
可以把一部分ClassC里的工作放在ClassB里去实现。
这样的写法看起来是不是有点奇怪?或者应该写成这样?

…..

delegate没有了…
所以说其实delegate只是一种模式,大家约定俗成,当把自己内部一部分实现暴露给另外一个类去做的时候,就叫实际做事的类为delegate。

为什么会需要把内部实现提出来给另一个类做呢?
最常见的目的就是为了在隐藏实现的前提下,提供一个自定义的机会。
比如Apple提供的iOS SDK里就有众多的delegate,比如最常用的UITableView,
我们没法知道Apple怎么重用UITableViewCell,怎么处理UITableView里Cell的增加、删减,因为我们没有源码。
但是我们可以通过实现Delegate的方法来控制一个UITableView的一些行为。
UITableViewDataSource其实和delegate是一样一样的,只是由于意义不同换了个名字罢了。

protocol在此扮演了什么角色呢?
protocol是一种语法,它提供了一个很方便的、实现delegate模式的机会。
比如写UITableView的时候,Apple这么干
UITableView.m

delegate是我们写的类,这个类如果可以被传给UITableView做为其delegate,那唯一要求,就是它实现了

这个方法。

如果我们把这个方法定义在一个protocol里

@protocol XXXProtocol
 - (void)guruguru;  @end

就说明了,UITableView需要的delegate是一个conform to XXXProtocol的类。
这就正好是

表达的意思。
无论具体的类是什么,它还有其它什么方法,只要它conform to这个protocol,
就说明它可以被传给UITableView,作为它的delegate。
那么Apple为了让我们知道这个protocol是delegate需要conform的protocol,
它就把XXXProtocol改成了UITableViewDelegate

这样我们看到protocol的名字里有Delegate,就知道这个protocol里的函数是用来做自定义(Customization)的了。

代码最终还是给人看的,公司里尤其如此。
大家都希望对方把事情讲得清晰易懂,如果在再有两句俗语或者行话那大家就很开心了 :]

//================================================================

  • delegate是对别的对象指针,按MVC一般最好赋值对象是Controller,它实现的是一种模式,它本身不是模式。Protocal是一组方法的定义。当id<protocal>定义为delegate时,就是要用别的对象即赋值的delegate去实现protocal里的方法,这个过程使用的模式就是代理模式。</protocal>

  • 可能有些人觉得后面一段难以理解,其实protocal就是一定要去实现的方法定义,那么delegate类里面要实现某个委托的方法。

    SO,Delegate类+protocal的话就保证了你另外实现的delegate类里面必须有这个委托方法,但至于delegate类还可以干其他事情,这个就由你来自定义了!

本文转载自:http://haoxiang.org/2011/08/ios-delegate-and-protocol/

Orange1
粉丝 9
博文 39
码字总数 21934
作品 0
苏州
程序员
私信 提问
delegate和protocol

iOS开发上对delegate使用广泛。 记在这里,如果有新人Google到了,希望能有点帮助。 protocol和delegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 pr...

长平狐
2012/10/09
147
0
[iOS]delegate和protocol

今天上班和同事讨论工程怎么组织的时候涉及到这个话题。 iOS开发上对delegate使用广泛。 记在这里,如果有新人Google到了,希望能有点帮助。 protocol和delegate完全不是一回事,放在一起说,...

Dean83
2012/07/31
310
0
facebook Graph APIs

Whenever a request is made via the requestWithGraphPath:andDelegate: method, a delegate must be specified in order to handle the response from the Facebook iOS SDK. It’s impor......

MrMign
2012/03/08
229
0
ios delegate你必須知道的事情

當你開始寫iOS程式不久,應該開始面對到很多的delegate, 不管是用別人的library或是自己寫library,可能都逃不了delegate。 為了怕有些人不知道什麼是delegate,在這邊簡單的介紹一下, de...

Dean83
2012/07/31
791
0
iOS 滚动视图编程指南

iOS 应用中的 Scroll view 用来显示和让用户操作大小超出屏幕显示范围的内容。Scroll view 主要有两个用途: 让用户拖动到他们想要显示的内容区域 让用户用双指手势放大、缩小 下图是一个典型...

灰大羊
2014/04/17
621
2

没有更多内容

加载失败,请刷新页面

加载更多

WPF界面开发—看DevExpress如何实现对.NET Core 3.0中的VS集成

下载DevExpress v19.2完整版 DevExpress v19.2汉化资源获取 通过DevExpress WPF Controls,您能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代...

FILA6666
5分钟前
35
0
总结:Java锁机制

一、 二、可重入锁与不可重入锁 可重入锁, 即一个线程可以进入任何一个 该线程 已经拥有的锁所同步着的代码块 。 参考: https://www.cnblogs.com/xdyixia/p/9383388.html...

浮躁的码农
9分钟前
51
0
SpringBoot+Mybatis+ShardingJDBC实现数据分片

研究了一番ShardingShpere, 用SpringBoot+Mybatis+ShardingJDBC搭建了一个最简单的数据分区的构架,在此记录一下。 ShardingJDBC是基于Mybatis等ORM框架和数据库之间的一层中间件,简单地说...

莫在全
9分钟前
74
0
为什么要有边缘计算

我们处在信息化的革命时代,后者说是数字化革命的时代,总而言之就是电脑的时代,一个把各式各样的信息都进行数字化的时代,然后交给计算机处理。我们需要知道整个计算机发展的本质,本质就是...

Jesse_0
10分钟前
116
0
MetInfo 修改版权标识的文字和超链接是否构成侵权

根据《米拓企业建站系统最终用户授权许可协议》中的“无论以任何用途、程度、方式(修改或美化),只要使用MetInfo的整体或任何部分,未获得版权标识修改许可,网站页面的版权标识(Powered...

MetInfo
16分钟前
82
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部