zoukankan      html  css  js  c++  java
  • iOS 代理

    这人写的不错

    iOS 的一点理解(一) 代理delegate

       做了一年的iOS,想记录自己对知识点的一点理解。

      第一篇,想记录一下iOS中delegate(委托,也有人称作代理)的理解吧。

      故名思议,delegate就是代理的含义, 一件事情自己不方便做,然后交给其他人去帮助实现, 比如A、B两个类,A的一个对象有一个任务aTask要在B类中实现,任务无法在A类本身中实现,所以要交给B类帮忙,则A和B约定一个协议:

    A类:

    复制代码
    1   @protocol ADelegate <NSObject>  
    2    -(void)aTask;   //协议的一个方法 3 4   @end 5 6   //代理属性,同时约定作为代理的对象必须实现ADelegate协议 7 8   @property (nonatomic,assign) id <ADelegate> aDelegate; //属性用assign不用retain是为了避免循环引用
    复制代码

    B类:

      B类中,B类继承A的代理,表示同意该协议,以后我们就按说好的办事了:

     1   //继承A的代理协议

    2 @interface B () <ADelegate> 

    3 @end  

      B用一个事件,比如按钮点击,在点击方法onBButtonClicked里触发任务:

    复制代码
     1   //按钮点击
     2   -(void)onBButtonClicked{
     3 
     4 
     5       //在B类中,初始化一个A类的对象aObj = [[A alloc] init];
     6       AViewController *aObj = [[AViewController alloc] init];
     7 
     8    //指定A类的代理,这事就交给aObj你去做了。
     9       aObj.aDelegate  = self;
    10     
    11       //判断_aDelegate实例是否实现了aTask方法
    12 
    13     //避免未实现aDelegate的类也作为A的监听
    14       if([A.aDelegate respondsToSelector:@selector(aTask)]){
    15           //_viewDelegate对象调用代理方法触发任务
    16           [A.aDelegate aTask];
    17         
    18           NSLog(@"excute A`s aTask");
    19       }
    20 
    21 
    22   }
    23 
    24 
    25   //在代理方法里实现A所交代的任务
    26   -(void)aTask{
    27 
    28    //具体任务内容
    29       NSLog(@"aTask is execute.");
    30   }
    复制代码

    小demo: DelegateDemo.zip

    补充: 1.在协议@Protocol里,有些方法不一定都需要实现,可以根据需求添加一些关键字来标记方法的重要性,比如

        @required //必须实现的方法
        @optional //可选实现的方法
         2.协议可以扩展自另一个协议,aDelegate就扩展自NSObject;
       3.协议中不能定义属性、成员变量等,只能定义方法;
       4. (2016-01-30补充)代理也经常用在页面跳转时候的传递value中,在点击按钮跳转的时候,用代理传值。
     如果存再多个代理,可以使用respondsToSelector方法判断哪个代理是否相应该代理方法。
    if ([_delegate respondsToSelector:@selector(sendValue:)]){} 

    引论:
       事实上在ObjC中协议的更多作用是用于约束一个类必须实现某些方法,而从面向对象的角度而言这个类跟接口并不一定存在某种自然关系,
    可能是两个完全不同 意义上的事物,这种模式我们称之为代理模式(Delegation)。在Cocoa框架中大量采用这种模式实现数据和UI的分离,
    而且基本上所有的协议都 是以Delegate结尾。


    参考链接:
         1. http://blog.csdn.net/jianxin160/article/details/47753189

         2. http://www.apkbus.com/forum.php?mod=viewthread&tid=137785

          3.  http://www.cocoachina.com/ios/20150112/10880.html

  • 相关阅读:
    linux 文件记录锁详解
    Linux fcntl函数详解
    大数相加
    信雅达面试题atoi函数实现
    linux getopt函数详解
    strcpy和memcpy的区别
    手把手写数据结构之栈操作
    手把手写数据结构之队列操作
    手把手写数据结构之双向链表操作
    ORACLE查询内存溢出
  • 原文地址:https://www.cnblogs.com/vector11248/p/7636020.html
Copyright © 2011-2022 走看看