您的位置:首页 > 移动开发 > IOS开发

谈谈对ios之协议代理的理解

2015-11-30 14:12 204 查看
接触ios开发也有一个多月了,对协议和代理的理解总是很模糊。今天看了很多博客,也参考了一些书籍,对ios中的协议与代理有了一种豁然开朗的感觉。这篇博文我并不想借助于大量的代码示例来讲述协议与代理,因为这个在网上和各种书籍上都介绍了很多,所以我换一个角度来说说我对协议与代理的理解(如果有误,希望大家批评指正)。

objective-c是一种面向对象的编程语言,因此少不了类、继承、多态等面向对象的特征。类这个东西就是对现实世界同一类实体的抽象,很容易理解,所以这里不在赘述。多态多数情况下可以理解为对方法的重写。最后,我想重点谈谈继承。继承就是子类继承父类的一些特性,而多继承是继承当中的很重要的一个组成部分。有人说,多继承存在于C++当中,而在Java、objective-c当中是没有多继承机制的。对,你说的没错!可是一个面向对象的语言没有多继承是不是显得有点尴尬呢。

说了这么多,与协议和代理还是没有半毛关系啊!别急,理解前面的前奏,对我们理解协议与代理很有必要。其实,协议与代理可以看作是objective-c间接实现多继承的一种方式。就是当一个类实现了多个协议的时候,那么它就必须实现这几个协议中@required方法,也就是说它拥有了这几个协议中的方法,这不就是我们想要的多继承吗!当然,这和多继承还是有一点区别的,毕竟只是拥有了方法,并没有得到实例变量。这一点是不是和Java中的一个类实现多个接口,从而达到实现多继承的方式很类似(谁说Java没有多继承!)。从这个角度,我们就可以把这里的协议理解为Java中的接口。

其实,我觉得协议与代理机制更重要的一个作用体现在规范和实现的分离,这是一种松耦合的设计,以《疯狂ios讲义》中的一段话来举例:

那么我们怎么来理解这种松耦合的设计呢?拿大家用的很多的UITableView中的两个协议UITableViewDataSource,UITableViewDelegate来举例(不想敲字直接截图(源:疯狂iOS讲义)):

如果上实现上面这些功能的方法,如:- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView
*)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

...............(还有很多)

都在UITableView这个类当中实现了话,那么当我们在不同的UIViewController中添加UITable时,为了实现不同的表格样式,我们就需要重写上面的所有方法,这是不是相当的繁琐。如果我们只是将这些方法定义在协议当中,而将代理设置为实现了这些协议的类的对象,并由这些实现了这些协议的类去具体实现这些方法。我们就可以轻松的实现不同的代理对象中定制不同的TableView。这是不是再一次说明了协议与Java当中的借口是不是神似,与C++中的抽象类是不是也神似!!!

好了,就说这么多了,如果大家以后带着上面这些思想去写与协议和代理相关的代码或看别人写的协议和代理相关的代码,肯定会有不一般的感受。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: