【转载】[iOS]delegate和protocol

ProtocolDelegate 使用方法详解 你要知道的KVC、KVO、Delegate、Notification都在这里转载请注明出处 http://www.jianshu.com/p/eafa34abdad5本系列文章主要通过讲解KVC、KVO、Delegate、Notification的使用方法,来探讨KVO、Delegate、Notification的区别以及相关使用场景,本系列文章将分一下几篇文章进行讲解,读者可按需查阅。 KVC 使 阅读详情

今天上班和同事讨论工程怎么组织的时候涉及到这个话题。
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)的了。

代码最终还是给人看的,公司里尤其如此。
大家都希望对方把事情讲得清晰易懂,如果在再有两句俗语或者行话那大家就很开心了 :]

告别软件轮询!用STM32G474的COMP比较器实现纳秒级硬件过压保护(CubeMX配置详解) 本文详细介绍了如何利用STM32G474的COMP比较器实现纳秒级硬件过压保护,通过CubeMX配置详解,展示了硬件比较器相比传统软件轮询方案在响应时间、CPU占用可靠性等方面的显著优势。文章还提供了实战配置流程优化技巧,帮助工程师快速构建高效的硬件保护系统。 阅读详情

相关推荐

Haystack框架实战:从零构建企业级智能问答系统

自然语言处理(NLP)技术通过让计算机理解生成人类语言,正在深刻改变信息检索与交互方式。其核心原理在于将文本转化为机器可处理的向量表示,并通过语义相似度计算实现精准匹配。这一技术价值在于能够从海量非结构化数据中快速提取精准信息,大幅提升知识获取效率。在工程实践中,检索增强生成(RAG)架构结合了密集向量检索与大语言模型生成能力,成为构建智能问答、知识库助手等应用的主流方案。该架构通过将用户查询与文档库进行语义匹配,并为大语言模型提供精准上下文,有效提升了回答的准确性与可追溯性。本文以Haystack这一生

weixin_42521032的博客 551

protocol(协议)、delegate(代理)

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

Jian_Ze的博客 277

LL-RB-MBGF-1402-Lessen&Learn-关于KUKA机器人外部焊枪配置总结.pptx

LL_RB_MBGF-1402_Lessen&Learn-关于KUKA机器人外部焊枪配置总结.pptx

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

转载)关于delegateprotocol 的理解 iOS

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

qq_25151593的博客 306

[iOS]delegateprotocol [转载]

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

neil's notebook 77

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

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

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

岽少的专栏 1496

iOSdelegateprotocol的关系

刚开始接触iOS,对delegate、category、protocol这几个概念比较模糊。参考了一些资料,记录下来体会。         1.protocol         protocolinterface的概念类似,是object-c语法的一部分。protocol就是一系列不属于任何类的方法的列表。其中声明的方法能被任何类实现。只在protocol中定义行为,在不同的

3327

Delegateprotocol的理解

其实delegate常说委托,委托类。protocol协议,实现协议。 先阅读一下这篇文章: http://haoxiang.org/2011/08/ios-delegate-and-protocol/#comment-581 那么我们怎么理解它们呢? 文章中作者也说道,protocol就是Objective-c的一个语法罢了。 @protocol ClassADelegate

Chiuan的专栏 2552

iOS开发之protocoldelegate

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

Mars2639——求知de路上 2万+

OC学习 - Protocol delegate

Procotol  协议  iOS开发常用技术    协议是一套标准(一套方法声明)  一般只有.h文件   没有父类也不能定义实例变量,只声明方法,声明未知类的接口,两个类之间的通信@required :必须实现。默认 @optional :选择性的实现 NSObject为基本类根类也为基协议,可以写也可以不写 Delegate : 代理 代理设计模式:两个对象协同解决难题,用于

拾光Blog 483
上一篇: IOS开发使用委托delegate在…
下一篇: 【Objective-C】iOS开发中常…
wakeupwakeup
博客等级 码龄11年 9粉丝 49原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值