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委托协议的内容介绍完了,希望通过本本文的学习能对你有所帮助!

详解Objective-C中委托和协议的更多相关文章

  1. 《TCP-IP详解卷3:TCP 事务协议、HTTP、NNTP和UNIX域协议》【PDF】下载

    TCP-IP详解卷3:TCP 事务协议.HTTP.NNTP和UNIX域协议>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062539 ...

  2. [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

    [转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...

  3. 详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

    详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别 http://blog.sina.com.cn/s/blog_686999de0100jgda.html   实例: ...

  4. 详解 Go 语言中的 time.Duration 类型

    swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...

  5. 详解jquery插件中(function ( $, window, document, undefined )的作用。

    1.(function(window,undefined){})(window); Q:(function(window,undefined){})(window);中为什么要将window和unde ...

  6. zz详解深度学习中的Normalization,BN/LN/WN

    详解深度学习中的Normalization,BN/LN/WN 讲得是相当之透彻清晰了 深度神经网络模型训练之难众所周知,其中一个重要的现象就是 Internal Covariate Shift. Ba ...

  7. 详解WebService开发中四个常见问题(2)

    详解WebService开发中四个常见问题(2)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  8. 详解WebService开发中四个常见问题(1)

    详解WebService开发中四个常见问题(1)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  9. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

随机推荐

  1. vijos 1047 送给圣诞夜的礼品 矩阵

    题目链接 描述 当小精灵们把贺卡都书写好了之后.礼品准备部的小精灵们已经把所有的礼品都制作好了.可是由于精神消耗的缘故,他们所做的礼品的质量越来越小,也就是说越来越不让圣诞老人很满意.可是这又是没有办 ...

  2. 用不动点组合子解递归(python实现)

    不动点组合子 Y = λf. (λx. f (x x)) (λx. f (x x)) θ = (λx. λy. (y(x x y))) (λx.λy.(y(x x y))) Y f = f (Y f) ...

  3. ArcEngine做栅格数据拉伸

    //获得已打开的栅格数据 IRasterLayer rasterLayer = new RasterLayerClass(); rasterLayer = (IRasterLayer)axMapCon ...

  4. Unix/Linux环境C编程入门教程(2) CentOS环境搭建

    Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 本文就带大家来安装CentOS并且配置好C/C++开发环境,这是一款Linux. ...

  5. iOS6和iOS7代码的适配(1)

    苹果的iOS7推出后,对于所有的应用来说都提出了一个天然的需求--适配不同版本的SDK.目前来说,用iOS6的SDK生成的应用,可以在iOS7的系统上跑,UI上也保持了原来的风格样式,这是苹果做的向下 ...

  6. Selector、shape详解,注意这两种图像资源都以XML方式存放在drawable不带分辨率的文件夹中

    Selector.shape详解(一) Selector的结构描述: <?xml version="1.0" encoding="utf-8"?> ...

  7. Android 刷新下拉控制 SwipeRefreshLayout

    上个月,google它宣布了自己的下拉刷新控制------SwipeRefreshLayout,控制封装在android-support-v4.jar包裹,依靠听力OnRefreshListener实 ...

  8. Android文件存储使用参考

    可能遇到的问题 android系统自身自带有存储,另外也可以通过sd卡来扩充存储空间.前者好比pc中的硬盘,后者好移动硬盘. 前者空间较小,后者空间大,但后者不一定可用. 开发应用,处理本地数据存取时 ...

  9. Mock.js 与 fiddler 前端模拟数据与拦截请求

    最近 工作需要  接触了Mock.js. Mock.js 是一款模拟数据生成器,旨在帮助前端攻城师独立于后端进行开发,帮助编写单元测试.提供了以下模拟功能: 根据数据模板生成模拟数据 模拟 Ajax ...

  10. 一个简单的Spring AOP例子

    转载自: http://www.blogjava.net/javadragon/archive/2006/12/03/85115.html 经过这段日子的学习和使用Spring,慢慢地体会到Sprin ...