zoukankan      html  css  js  c++  java
  • 通知/代理/block 三者比对

    通知

    :   “一对多”,”多对一” 传值

    四个步骤: 
     1.发送通知
    2.创建监听者
    3.接收通知
    4.移除监听者
            

    使用场景:
    1- 很多控制器都需要知道一个事件,应该用通知;
    2 - 相隔多层的两个控制器之间跳转

    注意事项:
      1, 一旦接收消息的对象多了,就难以控制了,可能有你不希望的对象接受了消息并做了处理
     2,创建了观察者,在dealloc里面一定要移除;

    —————————————————————————————————————————————————————————————

    代理

    “一对一”,对同一个协议,一个对象只能设置一个代理delegate


    六个步骤:
    1.声明一个协议,定义代理方法
    2. 遵循协议
    3.设置一个代理对象
    4.调用代理方法
    5.给代理赋值
    6.实现代理方法

    注意事项:

    1,单例对象不能用代理;
    2,代理执行协议方法时要使用 respondsToSelector检查其代理是否符合协议(检查对象能否响应指定的消息),以避免代理在回调时因为没有实现方法而造成程序崩溃



     使用场景:

    公共接口,方法较多也选择用delegate进行解耦 
    iOS最常用tableViewDelegate,textViewDelegate 
     iOS有很多例子比如常用的网络库AFNetwork,ASIHTTP库,UIAlertView类。


    —————————————————————————————————————————————————————————————


    block

    什么是Block:
    Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C语言的扩展,用来实现匿名函数的特性。
    Blocks语法块代码以闭包得形式将各种内容进行传递,可以是代码,可以是数组无所不能。

    闭包就是能够读取其它函数内部变量的函数。就是在一段请求连续代码中可以看到调用参数(如发送请求)和响应结果。所以采用Block技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性。



    使用场景:
    一:动画
    二:数据请求回调
    三:枚举回调
    四:多线程gcd
    ...

     异步和简单的回调用block更好 
    BLOCK最典型的是大所周知的AFNETWORK第三方库。

    注意事项:

    block需要注意防止循环引用:
        ARC下这样防止:
    __weak typeof(self) weakSelf = self;
      [yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
           [weakSelf doSomething];
        }];

         非ARC
    __block typeof(self) weakSelf = self;
      [yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
           [weakSelf doSomething];
        }];



    ———————————————————————————————————————————————————————————
    delegate 和 block对比
     
        效率:Delegate比NSNOtification高;

     1,   Delegate和Block一般都是一对一的通信;


     2,   Delegate需要定义协议方法,代理对象实现协议方法,并且需要建立代理关系才可以实现通信;

          Block:Block更加简洁,不需要定义繁琐的协议方法,但通信事件比较多的话,建议使用Delegate;


    3,  delegate运行成本低。block成本很高的。
    block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;delegate只是保存了一个对象指针,直接回调,没有额外消耗。相对C的函数指针,只多做了一个查表动作 .

    4,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
        block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息


    5 Blocks 更清晰。比如 一个 viewController 中有多个弹窗事件,Delegate 就得对每个事件进行判断识别来源。而 Blocks 就可以在创建事件的时候区分开来了。这也是为什么现在苹果 API 中越来越多地使用 Blocks 而不是 Delegate。
  • 相关阅读:
    iOS开发之巧用Block和代理方法结合来传值
    iOS开发之Bug--UITextField使用时文字向下偏移问题
    iOS开发之开源项目链接
    IOS开发之Bug--iOS7View被导航栏遮挡问题的解决
    Android开发--异步加载
    添加 All Exceptions 断点后, 每次运行都会在 main.m 中断的一种解决方法
    IOS开发之Bug--遇到一个类型不确定的bug
    iOS开发之功能模块--计算高度Demo探究手稿
    IOS开发之Bug--View是懒加载导致出误以为是UI加载的bug
    iOS中的round/ceil/floorf函数略解
  • 原文地址:https://www.cnblogs.com/1224dashen/p/5423048.html
Copyright © 2011-2022 走看看