protocol 和delegate(协议和代理)的区别
定义
protocol:中文叫协议,一个只有方法体(没有具体实现)的类,Java中称作接口,实现协议的类必须实现协议中@required标记的方法(如果有的话);
delegate:中文叫代理或委托,是一种设计模式。以协议的方式去体现(可以理解为协议的一种),区别在于代码中常以<xxxDeletgate>标示,以便清晰辨明此为代理。
举例说明
下面以一个ViewController要绘制TableView来进行说明:
要绘制TableView,首先要实现两个协议 UITableViewDataSource,UITableViewDelegate

我们先看看UITableViewDataSource里边都是怎么写的。

两个@required标明必须实现的方法,其他都是可选进行实现的方法
再来看看UITableViewDelegate 里都是怎么写的。

全是可选的方法,willxxx、didxxx 什么的,看起来跟UITableViewDataSource里的好像不太一样。
然后在http://blog.csdn.net/huifeidexin_1/article/details/7567731 这篇文章里,作者总结了代理的2个作用:
其次,我简单的总结了一下自己用到的委托的作用有两个,一个是传值,一个是传事件。1.所谓传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(切分紧耦合,和代码分块的时候经常用)2.所谓传事件就是a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该做出什么反映。(这个经常见,例如在异步请求中,界面事件触发数据层改变等等)3.利用委托赋值,这种方法感觉是为了不暴露自己的属性就可以给自己复值,而且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。
根据作者的描述,此代理的作用应该是传递事件。
等等,你说什么,好像不实现也没什么影响?再来看看另一个作者怎么说的。https://segmentfault.com/q/1010000003099524
你没完全理解“委托”的意思哈:)
首先,如楼上所说,
@optional后面的所有方法都是可选的。也就是说,UIActionSheetDelegate里面所有的方法都是不必须实现的。其次,就算你一个方法都不实现,actionSheet 也一样能“跑起来”,就是能正常显示出来,能正常点击。问题在于,你无法指定点击了之后干什么。
而通过实现这些委托方法,你才能指定点击按钮之后干什么。从方法名就能看出含义,比如如果用户点击了按钮,就会调用委托的
clickedButtonAtIndex方法了,就会执行你写在这个方法里的代码;如果你没实现这个方法,它就什么都不做。
那么 self.xxx.delegate = self 是什么意思? 摘自http://swiftist.org/topics/350
1.delegate在ios的开发中很常见,中文翻译成委托或者代理,意思我委托你帮我处理一些事情,delegate通常是以protocol形式出现,意思你要成为我的代理必须实现某些协议。
2.比如你在ViewController上放置了一个UITableView,如果你想在UITableView的Cell在被按下时做一些事情,就可以通知其delegate,我有一个cell被按下了,并附上cell的indexPath,通知的方式就是调用delegate的相关函数。
3.在上面的场景中,就需要将ViewController作为UITableView的delegate,并且ViewController必须要实现UITableViewDelegate的相关方法
还不理解的话,有个更通俗的解释 http://www.cocoachina.com/bbs/read.php?tid=259133
“委托的意思不就是自己的任务交给其他人去做么”你这么理解是对的
对象.delegate=self的意思就是对象的任务交给self去做 对象!=self假如你有对象A 对象B ,A是B的成员变量
class B
{
member A
}
在B中写这么一句“A.delegate=self”
按你的理解 应该是A的任务交给B去完成 理解了没
综上所述
普通的协议只是一个公共的接口,里面会规定你必须实现的一些东西;代理(一种特殊的协议),你实现其中方法的话,就是告诉发布代理的类,这件事你去做了。
个人愚见,不对之处,还请指出。
其他介绍两者区别的文章:
http://www.cnblogs.com/qingjoin/archive/2012/11/22/2782602.html
http://blog.csdn.net/chiuan/article/details/7539010
protocol 和delegate(协议和代理)的区别的更多相关文章
- Protocol and Delegate协议和代理
1.什么是协议? OC协议仿照Java的接口.协议和接口,都是不同类的对象之间一种通信的机制.2.协议的基础语法 单纯的语言描述协议的语法,很难让人理解,主要因为在OC中协议是类对象的通信机制,他 ...
- 简单例子让你很好的理解:协议与委托 (Protocol and Delegate)
1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 示例: 1 2 3 4 5 6 7 8 9 // GoodChild.h ...
- iOS——protoco和delegate (事件代理)
一:被代理人personOne personOne.h #import <Foundation/Foundation.h> @protocol SomeThing<NSObject& ...
- iOS开发之protocol和delegate
protocol--协议 协议是用来定义对象的属性,行为和用于回调的. 协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@op ...
- C++模拟实现Objective-C协议和代理模式
Objective-C的协议和代理是运用最多的特性之一,可以说在苹果系列开发中无处不在.事实上很多人都不知道其背后的原理.事实上简单点说,这就是设计模式中的代理模式的经典运用.代理模式简单点说就是为其 ...
- 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS)
目录 网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS) 简结 RTP RTCP RTSP 区别与联系 RTSP.RTMP.HLS 区别与联系 关于直播 流媒体各协议层次图 基 ...
- OC第九节——协议与代理
一.理解协议与代理 协议: 协议就是需要相互遵守的约定.规范:需要去实现协议中规定的方法. 代理: 代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表).它更像是一种关系,我要 ...
- 传参方法:sharedApplication, NSUserDefaults, protocol 和 delegate(实例)
本文转载至 http://blog.csdn.net/learnios/article/details/8442201 分类: 功能模块2012-12-27 10:22 109人阅读 评论(0) 收 ...
- ARP(Address Resolution Protocol)地址解析协议初识
ARP址解析协议是根据IP地址获取物理地址的一个TCP/IP协议.它工作在OSI七层模型的中第二层——数据链路层. 使用ARP地址解析协议,可根据网络层IP数据包包头中的IP地址信息解析出目标硬件地址 ...
随机推荐
- 添加图标:before 和 :after css中用法
#sTitle:after{ position: absolute; top: 2px; font-family: "FontAwesome"; content: "\f ...
- HMM隐马尔可夫模型(词语粘合)
HMM用于自然语言处理(NLP)中文分词,是用来描述一个含有隐含未知参数的马尔可夫过程,其目的是希望通过求解这些隐含的参数来进行实体识别,说简单些也就是起到词语粘合的作用. HMM隐马尔可夫模型包括: ...
- 在小程序中实现全局混入,以混入的形式扩展小程序的api
GitHub: https://github.com/WozHuang/mp-extend 相关文章: 小程序全局状态管理,在页面中获取globalData和使用globalSetData 通过页面预 ...
- [Papers] Semantic Segmentation Papers(1)
目录 FCN Abstract Introduction Related Work FCN Adapting classifiers for dense prediction Shift-and-st ...
- 转[总结]FFMPEG视音频编解码零基础学习方法 .
http://blog.csdn.net/leixiaohua1020/article/details/15811977 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视 ...
- Windows使用docker打开新窗口error解决办法
环境 win7 Error: error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.26/containers/json ...
- redis_2 数据类型
1.key Redis keys 命令 下表给出了与 Redis 键相关的基本命令: 序号 命令及描述 1 DEL key该命令用于在 key 存在时删除 key. 2 DUMP key 序列化给定 ...
- Android学习总结(4)——Andorid Studio熟练使用
前言 该文以Android Studio2.1.1(Bundle)为例.JDK使用的是1.8版本,也建议大家使用1.8版本. 使用技巧无先后顺序. Android Studio 2.1.1 软件下载 ...
- Forge.autodesk平台的使用
看了下面的这个网址的教程,发现其中的curl在git集成的shell中不好用,反复尝试后发现,&后面是没有空格的,记录下 https://forge.autodesk.io/
- JavaScript替换字符串中最后一个字符
1.问题背景 在一个输入框中,限制字符串长度为12位.利用键盘输入一个数字,会将字符串中最后一位替换,比方:111111111111.再输入一个3,会显示111111111113 2.详细实现 < ...