详解Objective-C中委托和协议

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

AD:【活动】Web和APP兼容性实战 Win10训练营免费报名

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];  

这样,最基本的委托机制就完成了,套用最通俗的一句解释: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. idUIBViewDelegate > _touchdelegate; //设置委托变量  
  9. }  
  10. @property(nonatomic,assign) idUIBViewDelegate > _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.    //实现协议  

小结:详解Objective-C委托协议的内容介绍完了,希望通过本本文的学习能对你有所帮助!

转载于:https://www.cnblogs.com/Free-Thinker/p/4988948.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

svn拉取文件合并_SVN分支(branches)合并(merge)到主干(trunk)和拉取分支(tag)

在一个团队协作且不断迭代更新的项目开发中&#xff0c;经常会使用到svn的一些分支主干的方法&#xff0c;这样的好处是使得各个版本之间可独立开发&#xff0c;大多数情况下是branch分支主要用来开发新的功能和版本迭代&#xff0c;主干上面及时快速的修复线上的一些bug和优化…

Unable to load native-hadoop library解决思路

最近试着搭建Hadoop&#xff0c;我使用的操作系统是Centos6.5&#xff0c;Hadoop版本是2.6.0。 在安装过程中总是出现&#xff1a;WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。 解决…

ios13苹方字体ttf_字体 | iOS1013 SF Compact Rounded 英文 By alex

最近沉迷游戏&#xff0c;差点忘记了这个英文。嗨呀&#xff0c;问就是在玩了&#xff0c;啊不&#xff0c;在做了。这个英文来自推特alexman&#xff0c;原版包含100和85大小&#xff0c;本次分享新增到了100-60&#xff0c;每5%一个大小。gzh分享已经获得alex授权&#xff0c…

Rust 中的继承与代码复用

Rust 中的继承与代码复用 在学习Rust过程中突然想到怎么实现继承&#xff0c;特别是用于代码复用的继承&#xff0c;于是在网上查了查&#xff0c;发现不是那么简单的。 C的继承 首先看看c中是如何做的。 例如要做一个场景结点的Node类和一个Sprite类继承它。 定义一个node基类…

怎么将自己的头像p到特定的背景图_【后期修图】photoshop手把手教你制作属于自己的酷炫的微信头像...

原标题&#xff1a;【后期修图】photoshop手把手教你制作属于自己的酷炫的微信头像效果图先放上1.新建一个白色的背景&#xff0c;这里是1080*720的。然后在图层面板下面单击创建新的调整图层/渐变&#xff0c;设 置 好渐变参数&#xff1a;黑白渐变&#xff0c;径向&#xff0…

10双屏鼠标过不去_灵耀X2 Duo双屏笔记本是怎样“炼”成的?对话华硕笔记本设计团队...

2020年的CES上&#xff0c;华硕推出了一款灵耀X2 Duo笔记本&#xff0c;灵耀X2 Duo采用了和灵耀X2 Pro相同的屏幕技术&#xff0c;C面同样采用了一块ScreenPad Plus副屏&#xff0c;机身也更轻更薄。如今灵耀X2 Duo的处理器升级至英特尔第十代酷睿&#xff0c;正在参与“618”大…

powershell加win的dns服务器,解决网站负载均衡问题

用我发明的powershell填坑法&#xff0c;加windows的dns服务器。从调整dns服务器解析ip时间段的角度&#xff0c;解决网站负载均衡问题。 ------------------------win2012r2中&#xff0c;用powershell管理dns服务器的&#xff0c;命令列表-------------------------------- 共…

csv python 只写一次_在Python CSV Writer循环中写入一次头

下面是一个scraper&#xff0c;它遍历两个网站&#xff0c;获取团队的花名册信息&#xff0c;将信息放入一个数组中&#xff0c;然后将数组导出到CSV文件中。一切都很好&#xff0c;但唯一的问题是每次scraper移动到第二个网站时&#xff0c;csv文件中的writerow头会重复出现。…

理解 OpenStack 高可用(HA) (6): MySQL HA

本系列会分析OpenStack 的高可用性&#xff08;HA&#xff09;概念和解决方案&#xff1a; &#xff08;1&#xff09;OpenStack 高可用方案概述 &#xff08;2&#xff09;Neutron L3 Agent HA - VRRP &#xff08;虚拟路由冗余协议&#xff09; &#xff08;3&#xff09;Neu…

聚类中心坐标公式如何使用_如何使用CAD看图软件来测量坐标?

当我们在拿到图纸的时候&#xff0c;经常会需要使用测量工具&#xff0c;再次测量dwg图纸上的数据。浩辰CAD看图王软件&#xff0c;不仅可以看图&#xff0c;也可以编辑图纸&#xff0c;测量功能更是很方便&#xff0c;当我们在测量的时候&#xff0c;如何测量图纸上点的坐标呢…

linunx 定位最耗资源的进程

[oracletopbox bdump]$ ps -ef|grep “(LOCALNO)”|sort -rn -k 8,8|head -10oracle 9402 1 67 09:18 ? 00:43:09 oracletopbox (LOCALNO)oracle 15524 12159 0 10:21 pts/2 00:00:00 grep (LOCALNO)oracle 15519 1 0 10:20 ? 00:00:00 or…

德利捷读码器设置软件_S7-1500PLC+变频器+编码器组成位置控制系统

PLC学习中组成部分&#xff1a;位置控制、力矩控制、惯量控制。位置控制模式S7-1500 的运动控制功能支持轴的定位和移动&#xff0c;是 S7-1500 系列 CPU 众多集成功能中的重要组成部分。运动控制功能支持旋转轴、定位轴、同步轴和外部编码器等工艺对象。根据PLC-Open&#xff…

解决 c3p0 和 MySQL 集成情况下,连接长时间闲置后重新使用时报错的问题

MySQL 的默认设置下&#xff0c;当一个连接的空闲时间超过8小时后&#xff0c;MySQL 就会断开该连接&#xff0c;而 c3p0 连接池则以为该被断开的连接依然有效。在这种情况下&#xff0c;如果客户端代码向 c3p0 连接池请求连接的话&#xff0c;连接池就会把已经失效的连接返回给…

汇编语言基础知识摘要(《汇编语言》王爽)第 1 / 17 章

CPU&#xff0c;是计算机的核心部件&#xff0c;它控制整个计算机的运作并进行运算。存储器&#xff0c;即内存&#xff0c;存放CPU需要的指令和数据。寄存器&#xff0c;是CPU中可以储存数据的器件&#xff0c;一个CPU中有多个寄存器。汇编语言由以下3类指令组成&#xff1a; …

vue 添加全局组件_自定义vue2.0全局组件(下篇)

在上篇中&#xff0c;老K为大家介绍了一个初级自定义按钮组件的编写方法。虽然能用&#xff0c;但是还不算完美&#xff0c;可扩展性不够强大。在这一篇中&#xff0c;老K继续为大家完善这个按钮组件。启动命令窗口&#xff0c; 进入在上篇中我们搭建的vue目录中&#xff0c;输…

dijkstra算法matlab程序_Dijkstra算法例子

在Dijkstra算法代码下载本文涉及到的代码。程序代码Dijkstra算法的程序如下&#xff1a;function [d, p] dijkstra(adj, s, t) % 使用dijkstra求最短路径 % adj 输入 矩阵 邻接矩阵 % s 输入 整数 起点 % t 输入 整数 或 [] 终…

hdu 3836 Equivalent Sets

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid3836 Equivalent Sets Description To prove two sets A and B are equivalent, we can first prove A is a subset of B, and then prove B is a subset of A, so finally we got that these two sets are equivalent.Y…

mysql-5.7.24 linux下载_Linux下安装mysql-5.7.24

本文档讲解安装版本为mysql-5.7.24&#xff0c;对于5.7.24之后的版本&#xff0c;不适用此说明文档&#xff0c;主要原因在于之后版本的mysql配置文件的目录位置和结构有所改变&#xff0c;使用此说明可能会出现找不到配置文件或者配置后不生效的情况。安装过程中务必保证文件路…

Spring MVC拦截器+注解方式实现防止表单重复提交

原理&#xff1a;在新建页面中Session保存token随机码&#xff0c;当保存时验证&#xff0c;通过后删除&#xff0c;当再次点击保存时由于服务器端的Session中已经不存在了&#xff0c;所有无法验证通过。 注&#xff0c;如果是集群的方式&#xff0c;则需要将token放入到缓存中…

JavaScript学习笔记(一)—— 数据类型

一、基本数据类型&#xff1a;1、js中基本数据类型:String、Boolean、Number、Null、undefined&#xff1b;复合数据类型&#xff1a;object对象类型、Array数组类型特殊对象&#xff1a;function函数类型基本数据类型① String —字符串。若使用var声明变量&#xff0c;var x…