[iOS]delegate和protocol [转载]

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

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

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

@protocol ClassADelegate

- (void)methodA;
- (void)methodB;

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

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

@interface ClassB <ClassADelegate> {
}
@end
就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议,
也就是实现了这一组函数。

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

ClassB *b = [[ClassB alloc] init];
[b methodA];
[b methodB];
而不用担心出现unrecognized selector sent to instance这种错误了。

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

id<ClassADelegate> b = ...;
[b methodA];
这种用法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。

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

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

我们也可以这样写

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

@interface ClassC {
ClassB *classB;
}
@end
…..

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

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

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

- (void)doSomething {
[self blahblah];

[self.delegate guruguru];

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

- (void)guruguru;
这个方法。

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

@protocol XXXProtocol

- (void)guruguru;

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

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

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

代码最终还是给人看的,公司里尤其如此。
大家都希望对方把事情讲得清晰易懂,如果在再有两句俗语或者行话那大家就很开心了 :]
3dMax效率翻倍!用Octopus章鱼插件打造你的专属快捷菜单(附MaxScript入门指南) 本文详细介绍了如何利用Octopus插件MaxScript脚本在3dMax中打造高效快捷菜单,显著提升三维建模与动画制作的工作效率。通过饼状菜单系统、自动化宏录制脚本控制,用户可实现个性化工作流,节省大量操作时间。文章还提供了MaxScript入门指南,帮助开发者快速掌握这一强大工具。 阅读详情

相关推荐

视觉Transformer实战 | Data-efficient image Transformer(DeiT)详解与实现

在计算机视觉领域,Vision Transformer (ViT) 已经证明了纯 Transformer 架构在图像分类任务上的强大能力。然而,ViT 通常需要在大规模数据集上预训练才能达到最佳性能,DeiT (Data-efficient image Transformer) 通过引入一系列训练策略优化,使得 Transformer 模型能够在相对较小的数据集上取得优异表现。本节将详细介绍 DeiT 的技术原理,并使用 PyTorch 从零开始实现 DeiT 模型。

盼小辉丶的博客 1300

protocol(协议)、delegate(代理)

protocol(协议)、delegate(代理) 一、protocol(协议) 1.概念:把多个类中的某些共同属性、方法抽象到一个类中,但这些属性、方法在不同的类中有不同的实现,相当于Java中的接口。协议只有声明,没有实现。使用者只需要遵守这个协议 ,就可以得到这个协议里面声明的方法 2.创建一个协议 如Test.h #imp...

Jian_Ze的博客 277

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1211

iOS开发Protocol (协议) delegate(代理)

一、Protocol(协议) protocoldelegate完全不是一回事。 协议(protocol),就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现 protocol就是一组函数定义,是从类声明中剥离出来的一组定义。 委托(delegate),顾名思义就是委托别人办事,就是当 一件事情发生后,自己不处理,让别人来处理。 Delegat

lilianyou163的专栏 970

iOS-Protocol(协议)Delegate(代理)

1.基础原理 我们平时说的代理其实分为Protocol(协议)Delegate(代理)两个部分。 协议不是代理,代理不是协议。 协议是多个类之间协商的一个公共接口,这个公共接口提供一系列方法的声明给其他类使用。 代理是协议的应用机制。 代理通俗来说就是我自己不方便去做的一些事(协议里定义的方法),我需要委托其他人来做这些事。我就是委托方,对方就是被委托方。 举个栗子: 一个View...

SunSatan的博客 632

delegateprotocol

今天上班同事讨论工程怎么组织的时候涉及到这个话题。 iOS开发上对delegate使用广泛。 记在这里,如果有新人Google到了,希望能有点帮助。 protocoldelegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 protocoljava里interface的概念类似,是Objective-C语法的一部分。 定义prot...

feipigwang 249

delegateprotocol

protocoldelegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 协议(protocol),就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。 委托(delegate),顾名思义就是委托别人办事,就是当 一件事情发生后,自己不处理,让别人来处理。 举个浅显的例子: ...

agcsdn2015的博客 152

转载】[iOS]delegateprotocol

今天上班同事讨论工程怎么组织的时候涉及到这个话题。 iOS开发上对delegate使用广泛。 记在这里,如果有新人Google到了,希望能有点帮助。 protocoldelegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 protocoljava里interface的概念类似,是Objective-C语法的一部分。 定义protocol如下

Never too late! 249

转载)关于delegateprotocol 的理解 iOS

http://www.cnblogs.com/qingjoin/archive/2012/11/22/2782602.html 原文地址   复制一遍方便查找 delegate  protocol 是objective-c 语法的一部分 但他们两个却完全不是一回事。主要是我们经常在同一个文件里见到这两个东西 protocol(协议)我的理解就是定义这么一个东西。以后就

qq_25151593的博客 306

ios----protocol, optional ,delegate

ios----protocol,delegate protocol——协议 协议是用来定义对象的属性,行为用于回调的。 协议中有两个关键字@private@optional,@private表示使用这个协议必须要写的方法,@optional表示可选的方法,用不到可以不写。 就像UITableVi...

weixin_34015566的博客 635

IOS系列——delegateprotocol

原文转载于 http://haoxiang.org/2011/08/ios-delegate-and-protocol/ 今天上班同事讨论工程怎么组织的时候涉及到这个话题。 iOS开发上对delegate使用广泛。 记在这里,如果有新人Google到了,希望能有点帮助。 protocoldelegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个w

Engandend的专栏 927

[iOS]delegateprotocol

自己之前对delegateprotocol有时有点模糊,看了这篇文章,发现讲得很清晰,转载下来,给有需要的同学。 protocoldelegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 protocoljava里interface的概念类似,是Objective-C语法的一部分。 定义protocol如下 @p

萱的house 834

Category,Extension,delegate protocol

1.为什么要用category(分类或类目)? 有时候我们需要扩展一下现有的类,增加一下功能,如果有源码,修改一下即可,如果是第三方的类库,就需要category它 的主要作用就是为没有源代码的类添加方法。 步骤:新建文件选择Objective-CCategory...

chongxienuo3437的博客 279

转:[iOS]delegateprotocol

今天上班同事讨论工程怎么组织的时候涉及到这个话题。iOS开发上对delegate使用广泛。记在这里,如果有新人Google到了,希望能有点帮助。 protocoldelegate完全不是一回事,放在一起说,只是因为我们经常在同一个头文件里看到这两个word。 protocoljava里interface的概念类似,是Objective-C语法的一部分。定义protocol如下 ...

weixin_30892987的博客 93

delegate或者protocol申请属性的时候为什么用assign而不是retain

delegate或者protocol申请属性的时候为什么用assign而不是retain

岽少的专栏 1496

传参方法:sharedApplication, NSUserDefaults, protocol delegate(实例)

本文转载至 http://blog.csdn.net/learnios/article/details/8442201 分类:功能模块2012-12-27 10:22109人阅读评论(0)收藏举报 IOS基础ios基础 1.iOS开发中使用[[UIApplication sharedApplication] openURL:] 加载其它应用 ...

a1311010193的博客 73

Obj-C中的ProtocolDelegate

Obj-C中的ProtocolDelegate——内容精选自CocoaChina提问贴:http://www.cocoachina.com/bbs/read.php?tid=48957 一、精典举例: 举个例子,也谈谈我对delegateprotocol的理解。 我上班的工作主要内容包括 (1)写代码(2)写文档(3)测试程序(4)接电话(5)会见客户 (1)(2)...

weixin_34129696的博客 184

协议(protocol) & 委托(delegate)

协议(protocol),就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。 委托(delegate),顾名思义就是委托别人办事,就是当 一件事情发生后,自己不处理,让别人来处理。 举个浅显的例子: 我上班的工作主要内容包括 (1)写代码(2)写文档(3)测试程序(4)接电话(5)会见客户 (1)(2)我自己全权负责,但...

diezhi9415的博客 169

截面数据DID处理&操作代码.zip

截面数据DID处理&操作代码.zip

ZionLadder-Setup.zip

ZionLadder_Setup.zip

上一篇: loadView的用法[转载]
下一篇: 两个UINavigationController嵌套问题:隐藏,跳转问题解决方法
zl19870208
博客等级 码龄19年 3粉丝 203原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值