首页 > 学院 > 开发设计 > 正文

MZN对iOS的一点理解(一)——关于代理delegate的个人理解

2019-11-14 18:05:58
字体:
来源:转载
供稿:网友

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

 

   原文:http://www.VEVb.com/A--G/p/4900241.html   转载请注明

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

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

A类中:

  @PRotocol ADelegate <NSObject>  
   -(void)aTask;

  @end

  //代理属性,同时约定作为代理的对象必须实现ADelegate协议

  @property (nonatomic,retain) id<ADelegate> aDelegate;

 

B类中:

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

  //继承A的代理协议

  @interface B () <ADelegate>

  @end

 

  B用一个事件,比如按钮点击,在点击方法onBButtonClicked里触发任务
  //按钮点击
  -(void)onBButtonClicked{


      //在B类中,初始化一个A类的对象aObj = [[A alloc] init];
      AViewController *aObj = [[AViewController alloc] init];

   //指定A类的代理,这事就交给aObj你去做了。
      aObj.aDelegate  = self;
    
      //判断_aDelegate实例是否实现了aTask方法

    //避免未实现aDelegate的类也作为A的监听
      if([A.aDelegate respondsToSelector:@selector(aTask)]){
          //_viewDelegate对象调用代理方法触发任务
          [A.aDelegate aTask];
        
          NSLog(@"excute A`s aTask");
      }


  }


  //在代理方法里实现A所交代的任务
  -(void)aTask{

   //具体任务内容
      NSLog(@"aTask is execute.");
  }
 

小demo 链接: DelegateDemo.zip

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

    @required //必须实现的方法    @optional //可选实现的方法
     2.协议可以扩展自另一个协议,aDelegate就扩展自NSObject;
   3.协议中不能定义属性、成员变量等,只能定义方法;


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


    


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表