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];
  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. 现在我们不用main()函数,在B的实现部分来实现委托机制:
  7. @implement B
  8. -(void)callPrint{
  9. [self.delegate print];
  10. }
  11. @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. @end
  28. A_View.h:
  29. @interface AViewController : UIViewController < UIBViewDelegate >
  30. {
  31. BView *m_BView;
  32. }
  33. @end
  34. A_View.mm:
  35. - (void)viewWillAppear:(BOOL)animated
  36. {
  37. m_BView._touchdelegate = self; //设置委托
  38. [self.view addSubview: m_BView];
  39. }
  40. - (void)ontouch:(UIScrollView *)scrollView
  41. {
  42. //实现协议
  43. }

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

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

详解Objective-C中委托和协议相关推荐

  1. php ping icmp,Linux_详解Linux系统中ping和arping命令的用法,pingping 程序使用 ICMP 协议的强 - phpStudy...

    详解Linux系统中ping和arping命令的用法 pingping 程序使用 ICMP 协议的强制回显请求数据报以使主机或网关发送一份 ICMP 的回显应答.回显请求数据报(" ping ...

  2. AXI接口协议详解-AXI总线、接口、协议

    转自:https://cloud.tencent.com/developer/article/1695010 AXI接口协议详解-AXI总线.接口.协议 AXI 总线 上面介绍了AMBA总线中的两种, ...

  3. 【详解】SPI中的极性CPOL和相位CPHA是什么以及如何设置

    [详解]SPI中的极性CPOL和相位CPHA是什么以及如何设置   2012-03-0214:34:10|  分类:单片机 |  标签: |字号大中小 订阅 版本:2011-08-15 作者:crif ...

  4. 十二、详解计算网络中的流量控制和差错控制、HDLC

    十二.详解计算网络中的流量控制和差错控制 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动 ...

  5. float属性html,详解CSS样式中的float属性

    详解CSS样式中的float属性.float是 css 样式的定位属性.我们在印刷排版中,文本可以按照需要围绕图片.一般把这种方式称为"文本环绕".在网页设计中,应用了CSS的fl ...

  6. java调用项目中的文件_详解eclipse项目中.classpath文件的使用

    1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...

  7. Session机制详解及分布式中Session共享解决方案

    Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...

  8. 图文详解】Chrome中安装JsonView插件

    图文详解]Chrome中安装JsonView插件 Chrome中如何安装JsonView插件?chrome插件网为您图文详解. 1.下载JsonView插件 在github中搜索JsonView,找到 ...

  9. 【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)

    作者 | 蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attention小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的注意力机制(二) 四万字全面详解 ...

最新文章

  1. 10 个 Linux 中方便的 Bash 别名
  2. 4、spring核心AOP
  3. 在哪开启oracle服务器,开启企业殿堂的钥匙 Oracle服务器的安装
  4. Java 知识总结大汇总!看完哪个都变大佬!
  5. 为了异常安全(swap,share_ptr)——Effecive C++
  6. 从开发者到讲师的心路历程与必知必会 | 原力计划
  7. opencv 打开视频或摄像头并按格式保存图片,读取图片
  8. wget 下载需要登录验证的网页文件
  9. Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener
  10. 如何快乐地检测SQL注入
  11. mysql 格林时间转换_oracle中将格林威治时间转化为一般时间
  12. IM即时通讯聊天软件1.0
  13. 保存在线阅读文件到本地的方法
  14. 【数论】GDKOI day1 讲座(数论基本知识 详)
  15. Python-day11~13-前端初步
  16. RTMP协议封装H264和H265协议详解
  17. AP6212WIFI蓝牙模块移植过程
  18. 删除所有奇数顺序表c语言,如何删除列表中的所有奇数序数项?
  19. 为什么你需要学 Go?
  20. 微信企业号通过token和userId获取用户头像

热门文章

  1. 蓝桥杯之--神秘三位数
  2. java 内存泄露 书籍_java虚拟机内存溢出和泄漏实例
  3. 大学计算机基础知识判断题,大学计算机基础学习知识判断题.doc
  4. vue 根据swagger 生成接口_采用vue编写的功能强大的swagger-ui页面
  5. android点击运行后无法显示设备,Android仿真器除了黑屏外什么都不显示,adb设备显示“设备离线”...
  6. C语言带参宏定义和函数的区别
  7. php游戏怎么设置fms,[FMS]FMS使用需要注意的几种问题总结说明
  8. MATLAB教程(1) MATLAB 基础知识(2)
  9. 计算机设计大赛国奖作品_1. 项目概要
  10. 【OpenCV 例程200篇】69. 连续非周期信号的傅立叶系数