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地址信息解析出目标硬件地址 ...
随机推荐
- PhotoZoom放大图片,真的能无损吗?
当然想要无损放大一张很小的图片时,总会有人会和你推荐PhotoZoom这款软件,那么它真的和说的一样,可以无损放大吗?下面小编挑了2张图片做了一下对比. 案例1,我们选取一张尺寸为200x200像素的 ...
- mvvm模式和mvc模式 概述总结对比
1.mvc模式简介: MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范.例如: angular ...
- python tips: is同一性运算符
is用来判断两个对象是不是同一个对象,通过id()函数取对象地址进行判断.python会缓存一些小的整数,以及只包含字母数字以及下划线的字符串.所以在对于这些值的时候,is判断为True. >& ...
- Disconf入门指南(1)
Disconf简介 参考: https://github.com/knightliao/disconf/wiki/TutorialSummary 在一个分布式环境中,同类型的服务往往会部署很多实例.这 ...
- git 教程2 (git常用命令解说)
<1>$ git -- help (调出git的帮助文档) <2>$ git +命令 --help (查看某个具体命令的帮助文档) <3>$ git --versi ...
- python面向对象的三大特性之一多态
多态 多态的特性是调用不同的子类将会产生不同的行为,而无需明确知道这个子类实际上是什么 说白了就是,不同的对象调用相同的方法,产生不同的行为 例如:s1是字符串类型,w1是列表,两个完全不同的对象,他 ...
- web service服务是查询QQ用户是否在线
使用php5开发客户端: <?php try { //$client = new SoapClient("HelloService.wsdl",array('encoding ...
- mybatis入门截图总结
原生态jdbc存在的问题 ------------------- ----------------------- ------- 环境的搭建 ----------------------------- ...
- 洛谷——P1802 5倍经验日
https://www.luogu.org/problem/show?pid=1802#sub 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好 ...
- [Tailwind] Get started with Tailwindcss
In this lesson, we learn how to generate CSS utility classes from Tailwind's JavaScript config file. ...