Objective-c 协议与委托

22、Objective-C 中的协议与委托机制详解 本博客详细解析了 Objective-C 中的协议与委托机制,涵盖非正式协议与正式协议的区别及应用,通过实际示例如 ITunesFinder 和 CarParts 展示了委托对象的实现、协议的采用与方法响应。同时介绍了类别、选择器在委托机制中的作用,并结合图形绘制应用演示了委托与协议的综合应用,帮助开发者编写灵活、可维护的面向对象代码。 阅读详情

from:http://mobile.51cto.com/iphone-283416.htm

Objective-C中委托和协议是本文要介绍的内容,委托和协议是两个概念,协议实际上相当于C++中的纯虚类的概念,只定义并只能由其它类来实现。而委托类似于Java中的接口。(Objective-C实现委托这种机制是利用协议来实现的,这种说法我现在认为是不对的,理由下述:)。

Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托。下面说明了实现方式:

定义一个类A:

  
  1. @interface A:NSObject  
  2. -(void)print;  
  3. @end  
  4. @implement A  
  5. -(void)print{  
  6. }  
  7. @end 

定义一个类B,在B中定义类A的实例为B中的成员变量:

  
  1. @interface B:NSObject{  
  2.        A *a_delegate;  
  3. }  
  4. @end 

下面在mai()函数中实现委托机制:

  
  1. void main()  
  2. {  
  3. B *b=[[B alloc]init];  
  4. A *a=[[A alloc]init];  
  5. b.a_delegate=a;  
  6. [b.a_delegate print];  
  7. } 

这样,最基本的委托机制就完成了,套用最通俗的一句解释:B需要完成一个print的操作,但他自己并没有实现这个操作,而是交给了A去完成,自己只是在需要时调用A中实现的print操作。

下面再写一种实现方式,这样方式更接近于我们通常见到的用协议还实现的方式:

我们还是定义一个类A:

  
  1. @interface A:NSObject{  
  2. B *b;  
  3. }  
  4. -(void)print;  
  5. @end  
  6. @implement A  
  7. @synasize delegate;  
  8. -(void)viewDidLoad{  
  9. b=[[B alloc]init];  
  10. b.delegate=self;  
  11. }  
  12. -(void)print{  
  13. NSLog(@"print was called");  
  14. }  
  15. @end 

然后类B的定义改成如下所示:

  
  1. @interface B:NSObject{  
  2. id delegate  
  3. }  
  4. @propert(nonamtic,retain) id delegate;  
  5. @end  
  6.  
  7. 现在我们不用main()函数,在B的实现部分来实现委托机制:  
  8.  
  9. @implement B  
  10. -(void)callPrint{  
  11. [self.delegate print];  
  12. }  
  13. @end 

上面这种实现方式和第一种其实是一样的,只是第一种是在第三方函数调用委托方法。delegate是id类型,本例中就是A类的一个实例,当然可以调用A类中的print。第二种方式不存在第三方函数,是在B类中调用 A类中的方法。或者说,B中需要print方法,自己不实现,让A来实现,自己调用 。

再接下来就是最常见的用协议实现委托的方式,说明如下:

protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。

delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。

当一个A view 里面包含了B view

b view需要修改a view界面,那么这个时候就需要用到委托了。

需要几个步骤

1、首先定一个协议

2、a view实现协议中的方法

3、b view设置一个委托变量

4、把b view的委托变量设置成a view,意思就是 ,b view委托a view办事情。

5、事件发生后,用委托变量调用a view中的协议方法

例子:

  
  1. B_View.h:  
  2. @protocol UIBViewDelegate <NSObject> 
  3. @optional  
  4. - (void)ontouch:(UIScrollView *)scrollView; //声明协议方法  
  5. @end  
  6. @interface BView : UIScrollView<UIScrollViewDelegate> 
  7. {  
  8. id< UIBViewDelegate > _touchdelegate; //设置委托变量  
  9. }  
  10. @property(nonatomic,assign) id< UIBViewDelegate > _touchdelegate;   
  11. @end  
  12. B_View.mm:  
  13. @synthesize _touchdelegate;  
  14. - (id)initWithFrame:(CGRect)frame {  
  15. if (self = [super initWithFrame:frame]) {  
  16. // Initialization code  
  17. _touchdelegate=nil;  
  18. }  
  19. return self;  
  20. }  
  21. - (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event  
  22. {  
  23. [super touchesBegan:touches withEvent:event];  
  24. if(_touchdelegate!=nil && [_touchdelegate respondsToSelector: @selector(ontouch:) ] == true)   
  25. [_touchdelegate ontouch:self]; //调用协议委托  
  26. }  
  27.  
  28. @end  
  29. A_View.h:  
  30. @interface AViewController : UIViewController < UIBViewDelegate > 
  31. {  
  32. BView *m_BView;  
  33. }  
  34. @end  
  35. A_View.mm:  
  36. - (void)viewWillAppear:(BOOL)animated  
  37. {  
  38. m_BView._touchdelegate = self; //设置委托  
  39. [self.view addSubview: m_BView];  
  40. }  
  41. - (void)ontouch:(UIScrollView *)scrollView  
  42. {  
  43.    //实现协议  
  44. }

22、Objective-C 中的委托、类别与协议详解 本文详细讲解了 Objective-C 中的委托、类别与协议等核心概念,包括非正式协议与正式协议的区别及其应用,通过实际项目示例(如 ITunesFinder)展示了委托机制的工作原理与实现方式,同时深入探讨了协议的声明与采用方法,并结合 NSCopying 和 NSCoding 协议说明了复制与归档的实现细节。 阅读详情

相关推荐

手写Socket Web服务器:深入HTTP协议底层原理

HTTP协议是Web通信的基石,其本质是一套严格定义的文本格式与状态交互规范。理解它需回归传输层——TCP连接建立、请求响应格式(如状态行、头/体分隔符\r\n\r\n)、字符编码与字节长度一致性等核心原理。这些知识直接决定CORS拦截、中文乱码、Content-Length错误等高频问题的排查效率。在现代框架封装日益厚重的今天,亲手用Socket实现一个可被Chrome识别的极简Web服务器,成为掌握Web运行机制最有效的实践路径。本文即以DebugLZQ经典案例为蓝本,还原从URI解析、DNS查询、So

weixin_40192258的博客 534

8.2 委托模式(Delegate Pattern)

委托模式

NorthStar的博客 1599

配电网可靠性评估(一)—最小路法和非序贯蒙特卡洛模拟法的matlab实现

电力系统的可靠性研究是相关领域的热点问题。根据研究对象的不同,又可分为发电系统的可靠性,输电系统的可靠性和配电系统的可靠性。配电网在电力系统中处于最末端的位置,直接和用户相连,一旦出现故障情况,就会在用户侧表现为停电事故。因此对配电网的可靠性评估有着重大意义。......

配电网和matlab的博客 1万+

设计模式-委派模式

通俗点讲就是有两个对象参与(两个对象协同)处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。可以发现和静态代理类的类图一样,所以也叫做特殊的静态代理,唯一的区别就是关注点不一样,一个是过程一个是结果代码如下: 代码示例 举个典型的例子:路由,我们知道路由的作用就是在不同网段之间转发数据的,当路由器接受到一个消息的时候她会根据消息头部中的信息找出对应网段再根据自己的路由表找到对应的机器再转发给实际接收者,这里面路由就是一个委托者角色而注册到这个路由中的计算机则是实际执行

BASK2311的博客 1189

ESP32 LVGL开发板例程使用记录:自制常用汉字字库(二)

1、将下载的文件移入工程文件中 ,路径为项目文件中 ”......\lib\lvgl\src\font“文件夹下。3、修改字库配置文件,文件名为lv_conf.h中的内容,向其中加入下面内容(位置可搜索注释块来找到地方)修改完成可以编译试试,看是否成功,如字库较大时编译出错,请使能:LV_FONT_FMT_TXT_LARGE。2、打开此文件,修改包含头文件的路径,不然会报错,修改方法可对照自己库中其他字库文件中的包含路径。导入完成后在VSCode工程中可以查看到此文件。上次说完了如何制作 字库.c 文件。

qq_43279097的博客 1958

硬核反坑!YOLOv5训练避坑指南:根治梯度消失、不收敛、检测漏框三大核心问题(附实战代码+调优清单)

数据是基础,超参数是关键,模型是工具,训练策略是保障。梯度消失、不收敛、检测漏框这三大问题,本质上都是“数据-模型-训练”不匹配的结果。梯度消失/爆炸:优先调整学习率策略+梯度裁剪,其次优化模型结构;训练不收敛:优先清洗数据集,其次调优超参数,最后检查配置文件;检测漏框:优先重新聚类锚框,其次增强浅层特征,最后调整推理参数。YOLOv5训练的最高境界,不是调参,而是让数据、模型、训练策略三者完美匹配。按本文的方法反坑,你的YOLOv5训练一定能一次成功!🚀。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 233

Objective-C的委托(Delegate)

要实现委托效果,在Objective-C中最要的是,类必须遵循某个正式或非正式的协议,然后把自己的self指针指派给委托。

痴_Pro的博客 2796

1️⃣ Coze智能体基础入门教学(2025年全新版本)

不妨设想一下,倘若我们能够打造出一个数字助手,它不但能精准洞悉我们的需求,更可以独立思索、学习以及付诸行动,这便是 AI Agent 的基础理念。它恰似计算机世界里的 “智慧精灵”,能够感知周遭环境、做出判断并采取行动。AI Agent 的发展之路精彩纷呈。它走过了三个重要阶段:起初,它犹如一个被规则束缚的机器人,只能按预设好的指令开展工作。接着,它学会运用统计学方法,通过分析数据来做决策,变得越发灵活。到如今,凭借深度学习技术,它已经能够像人类一样去学习复杂的任务了。

李同学Lino的博客 4086

委托模式(代理模式)详解

什么是委托模式:       委托delegate是协议的一种,通过一种@protocol的方式来实现。 委托模式的作用:       我们首先要知道委托模式的作用到底有哪些?理清这个问题,才知道改在什么情况下去用这个delegate。 委托的作用有两个,一个是传值,另一个是传事件: 所谓传值就是B类要把自己的一个数据或者对象传给A类,让A类去展示或者处理。 所谓的传事件就是,简单...

BangBangShooting的博客 1539

手把手教你学simulink(16.8)--基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目

基于Simulink的小波变换滤波器(Wavelet Transform Filter)项目的详细实例介绍。这个项目将重点放在小波变换滤波器的设计、实现和仿真上,帮助你理解和应用小波变换滤波器在信号处理中的作用。

MHD0815的博客 534

基于STM32设计的电能质量控制系统_353

本项目基于STM32F103RCT6微控制器设计了一套电能质量控制系统,实现了对火焰、烟雾、环境温湿度、电压、电流及功率等多项参数的实时监测与报警。系统通过MQ2烟雾传感器、火焰传感器、SHT30温湿度传感器及电力参数采集模块采集数据,采用高电平触发有源蜂鸣器进行异常报警。采集的数据通过ESP8266无线模块以AP+TCP模式上传至基于Qt开发的手机APP和电脑上位机,实现远程实时监控和历史数据管理。系统配备1.44寸LCD显示屏,实现本地数据显示。软件采用Keil5开发,采用寄存器编程方式,提高系统响应速

253

Objective-c 协议和委托

一直对Objective-c中的协议和委托不太理解,也弄不清楚委托和协议之间有什么必然的联系。今天看了一篇博文个人感觉很好,在此做个小小的总结! 委托和协议是两个概念。 Objective-C委托和协议本没有任何关系,协议就是多个类共享的一个方法列表,对于“委托”则和协议没有关系,只是我们经常利用协议来实现委托的机制,其实不用协议也完全可以实现委托。下面说明了实现方式: ...

weixin_30316097的博客 132

Java代码变更影响分析:从静态解析到动态调用图的实战全链路

本文介绍了Java代码提交影响分析的核心原理与实现方法。主要内容包括:1)静态分析技术,通过JavaParser解析AST构建调用图,记录类与方法间的调用关系;2)动态分析技术,使用ByteBuddy进行字节码增强,捕获运行时调用路径;3)JCCI工具实现,结合javalang、unidiff等技术分析代码改动影响,并将结果存储到SQLite数据库。文章提供了完整的代码示例,展示了从AST解析、动态调用跟踪到实际工具应用的完整技术栈,为代码变更影响分析提供了实用解决方案。

墨夶的博客 1252

详解Objective-C中委托和协议

Objective-C委托和协议本没有任何关系,协议如前所述,就是起到C++中纯虚类的作用,对于“委托”则和协议没有关系,只是我们经常利用协议还实现委托的机制,其实不用协议也完全可以实现委托。 Objective-C中委托和协议是本文要介绍的内容,委

henry_sea的专栏 1142

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Objective-C 中的协议和委托

Objective-C 中的协议和委托 ​ 刚开始学习OC的时候,会接触到协议和委托的概念,刚开始学习理论的时候呢,感觉这两个概念很好理解:协议的话就是类似于java中的接口,类比于C++中抽象类嘛,这有啥;委托的话按照字面意思不就是说我要干一件事,但是我不想自己干,于是找了另外一个人代替我去干嘛,又没啥难的。其实这样理解确实没错,但是由于这是纸上谈兵,面对实际项目中的一堆delegate,把我给整迷糊了,哈哈,还是代码写得太少了,talk is cheap, show me the code !

weixin_43025806的博客 264

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

objective-c 协议和委托

objective-c protocol delegateprotocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。 delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。当一个A view 里面包含了B viewb view需要修改a view界面,那么这个时候就需要用到委托了。需要几个步骤1。首先定一个协议2。a view实现协议中的方法3。b view设置一个委托变量4。把b view的委托变量设置成a view,

luyi_happy的专栏 2859

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Objective-C学习 协议和委托

protocol 协议名<父协议1 : 父协议2> {零到多个方法定义 ...对上面语法格式的详细说明如下。协议名应与类名采用相同的命名规则。即如果仅从语法角度来看,协议名只要是合法的标识符即可;如果要遵守 Objective-C 可读性规范,则协议名应由多个有意义的单词连接而成,每个单词首字母大写,单词与单词之间无须任何分隔福符。一个协议可以有多个直接父协议,但协议只能继承协议,不能继承类协议中定义的方法只有方法签名,没有方法实现;协议中包含的方法既可是类方法,也可是实例方法。

for_ever_love__的博客 537

Objective-C中协议和委托

Objective-C中的协议(Protocol)类似于常用的接口,协议(Protocols)中定义的方法,在类中实现。 @protocol MyFirstProtocol - (void)myFirstProtocolMethod; @end 在iPhone OS中,协议(Protocol)通常用来实现委托对象(Delegate Object)。委托对象(Delegate Object)

hong1595的专栏 600

Objective-C中协议和委托简述

1.1定义协议: 创建一个.h文件 1: _MyProtocolName.h 2: @protocol MyProtocolName 3: @end 注:协议中没有变量; 是代表在此声明的协议是NSObject协议的衍生协议(不是NSObject类); 1.2使用协议: 1: @interface CustomView:UIView

550

协议与委托(Objective-C)

协议定义某一批类所需要遵守的规范,它不关心这些类的内部状态数据,也不关心这些类里方法的实现,它只规定这批类中必须提供某些方法。 协议不提供任何实现,协议体现的是规范和实现分离的设计哲学。 OC中协议的作用相当于其他语言中接口的作用。 使用类别实现非正式协议 以NSObject类为基础,为NSObject创建类别,创建类别时即可指定该类别应该新增的方法。 当某个类实现NSObject的该类别时,就...

wtl1804的博客 126

objective-c之委托协议详细讲解

委托协议,相信是大多objective-c初学者非常疑惑的一个概念,下面我来给大家讲解讲解: 下面先让大家了解几个概念 protocol-协议,就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。  delegate-委托,顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。 当一个A_View 里面包含了B_View B_View需要调

ComeOnTom的专栏 1119
上一篇: Objective-C中一种消息处理方法performSelector: withObject:
下一篇: iOS 中监听观察通知的几种方法
lynjay
博客等级 码龄18年 27粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值