zoukankan      html  css  js  c++  java
  • 浅谈iOS开发的协议(protocol)和代理(delegate)

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的。网上的很多博文只是讲了怎么使用,并没有说的很明白。下面我谈一下我的理解。

    1.你要先搞明白,协议和代理为什么会出现,也就是说它存在的意义是什么,解决了什么问题。

    协议和代理是模块化开发和封装的产物。
    先讲一个小故事帮助大家理解:

    老王有一家餐馆,刚刚开始的时候规模很小,所以老王一个人做了所有的事情:扫地,做菜,迎宾,上菜,收银。但是后面随着规模的扩大,老王一个人就吃不消了,忙死也忙不过来了。这时候怎么办?大家都很清楚吧,招人呗!所以后面就有了服务员,收银员,大厨,保洁员。
    这就意味着原先老王的工作按模块进行了拆分。

    老王开餐馆

    餐馆的工作流程(业务逻辑)简单来说是这样的:点餐->做菜->上菜->收银->打扫卫生。

    转换成编程世界的模型就是这样的:业务不是很复杂的时候,我们把所有的功能都写在一个类里面,这个类暂且叫老王,理论上所有的事情和功能都可以写到这个类里面。做菜方法,上菜方法,打扫方法......就造成了老王这个类非常的庞大和臃肿,并且容易出错。

    那我们开始招人了,新建了大厨类,服务员类,收银类,保洁类,这四个类。大厨类有做菜方法,服务员类点菜,上菜方法,收银类有收银方法,保洁类有打扫方法。

    仅仅这样还是不行的,因为模块开发必然就有模块分化以后模块之间的通信问题。大厨类只做菜 但是菜做好了怎么办,必须及时的上菜,让顾客享用。但是大厨自己不能上菜,所以大厨必须抛出菜做好了的信号,具体这个菜上不上,怎么上,就不是大厨关心的了。

    2.协议和代理所发挥的作用

    老王交代大厨,你只管做菜,菜做好了以后喊一声菜做好了(我见过一个餐馆是拉铃铛)。
    那么老王跟大厨定的这个规矩就是协议(protocol),下面看代码:

    DaChu.h
    
    /**
     *  下面是声明协议的固定格式,DaChuDelegate是协议的名称,因为是代理协议,名称格式为:类名+Delegate
     */
    @protocol DaChuDelegate <NSObject>
    - (void)doSomethingAftercaiZuohaole;
    @end
    
    @interface DaChu : NSObject
    /**
     *  delegate 是dachu类的一个属性,weak 关键字是为了避免循环引用,<DaChuDelegate>表示遵守DaChuDelegate协议
     *  更加直白点:在大厨心里有一个人接受他的菜好了的信号去做一些事情,具体这个人是谁,大厨不关心,这个人的代号是delegate
     */
    @property (nonatomic, weak) id <DaChuDelegate> delegate;
    - (void)kaiShiZuoCai;
    @end
    
    Dachu.m
    #import "DaChu.h"
    
    @implementation DaChu
    - (void)kaiShiZuoCai{
        NSLog(@"开始做菜");
        sleep(2);
        NSLog(@"做好菜了,该上菜了");
        
       //下面这句是判断 一下delegate是否实现了doSomethingAftercaiZuohaole方法,如果delegate没有实现
        //直接[self.delegate doSomethingAftercaiZuohaole];会crash
        if ([self.delegate respondsToSelector:@selector(doSomethingAftercaiZuohaole)]) {
            [self.delegate doSomethingAftercaiZuohaole];
        }
        
    }
    @end
    

    下面看一看laowang这个类里面的内容

    #import "LaoWang.h"
    #import "DaChu.h"
    
    @interface LaoWang ()<DaChuDelegate>//<DaChuDelegate>表示遵守DaChuDelegate协议,并且实现协议里面的方法
    
    @end
    
    @implementation LaoWang
    - (void)laoWangKaiYe{
        NSLog(@"老王开业了");
        
        DaChu *dachu1 = [[DaChu alloc] init];
        dachu1.delegate = self;//说明老王充当代理的角色,负责接收菜好了的信号。
        [dachu1 kaiShiZuoCai];//大厨开始做菜
    }
    - (void)doSomethingAftercaiZuohaole{
        NSLog(@"老王知道了");//这里可以通知服务员去上菜了
    }
    @end
    

    上面的这个过程,也可以看下图来理解:
    代理和协议
    关于协议的理解,大家还可以参考这篇博文。
    http://www.cnblogs.com/iyou/p/3636848.html

    如果你喜欢这篇文章,请关注我,您的支持十分重要!

  • 相关阅读:
    mysql导入到elasticsearch
    ulimit -c unlimited
    ajax 调用后台接口示例
    完整的拆分nginx访问日志
    rsyslog input 不支持变量
    完整的多项匹配tomcat access日志的正则
    logstash 中的贪婪匹配
    logstash 内置匹配IP
    时间类处理<1>
    JS获取鼠标位置,兼容IE FF
  • 原文地址:https://www.cnblogs.com/iyou/p/4939823.html
Copyright © 2011-2022 走看看