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. sqlserver 常用函数(转)

    1.字符串函数 : len(expression) 返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格. datalength(Char_expr) 返回字符串包含字符数,但不包含后面的 ...

  2. RelativeLayout布局下实现控件平分空间

    起源:使用惯LinearLayout的朋友都知道,若想实现对屏幕的等分,只需要设置Layout_weight的值即可. 可是在RelativeLayout布局下实现等分却不是那么容易. 下面就简单介绍 ...

  3. 删除字符串中多余的空白字符和空行(C语言实现)

    要求:处理一个字符串,删除字符串中多余的空格.水平制表符和空行,并满足下列要求: (1)对原字符串只能进行一次扫描.(2)不允许申请新的空间.(3)处理后的字符串的首尾不能有空格.制表符和空行.(4) ...

  4. BadgeView使用介绍

    前段时间做的一个淘宝客的项目,需要在商品图片上添加价格标签,之前自己使用TextView和Cavas绘制的感觉效果一般,今天偶然在CSDN上发现BadgeView这个开源项目,在git下载下来之后,使 ...

  5. Android Json生成及解析实例

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  6. Jave中System.getProperty()获取的值

    java.version Java 执行时环境版本号 java.vendor Java 执行时环境供应商 java.vendor.url Java 供应商的 URL java.home Java 安装 ...

  7. hahahahah

    dsfsefesfsffsfsfsfsfesfsfsfsfsfsfspackage realm;   import java.util.ArrayList; import java.util.List ...

  8. char、varchar和nvarchar的区别

    首先char.varchar和nvarchar.text.ntext都是数据库中的文本数据类型,再区分区分var前缀.n前缀的区别.而text.ntext已经普遍被varchar(MAX)和nvarc ...

  9. Div实现滚动条效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Javascript 中创建自定义对象的方法(设计模式)

    Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. var ...