@protocol(协议)和@delegate(代理)的个人理解 通俗易懂

Posted 三十六变

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@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(代理)的个人理解 通俗易懂的主要内容,如果未能解决你的问题,请参考以下文章

iOS 委托代理与协议(Delegate and Protocol)

Protocol, Delegate

协议(Protocol)与委托代理(Delegate)

协议规范

iOS 代理(Delegate)

iOS Swift delegate的使用