协议代理,block的区别

作者: ChangeWorld | 来源:发表于2016-02-28 21:33 被阅读3185次

    之前面试遇到有问这样的问题,我的回答可能比较片面,不够深入。

    下面是我的回答(不善言谈的我):

    “代理和block的共同特性是回调机制,不同的是,代理的方法比较多,比较分散。

    使用block的代码比较集中统一。”

    我在网上搜了搜有以下结论:

    代理的好处:

    delegate运行成本低。block成本很高的。

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

    delegate:

    1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,单例对象就不能用代理这是不对的❎,任何人,任何对象,只要接受,只要允许,只要遵守了相关的协议,TA就可以使用代理(感谢http://www.jianshu.com/users/22fefaea871c同学指出错误);

    2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败

    block:

    1:写法更简练,不需要写protocol、函数等等

    2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息

    3,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];

    }];

    *什么时候用代理,什么时候用block

    公共接口,方法较多也选择用delegate进行解耦

    iOS有很多例子比如最常用tableViewDelegate,textViewDelegate

    异步和简单的回调用block更好

    iOS有很多例子比如常用的网络库AFNetwork,ASIHTTP库,UIAlertView类。

    相关文章

      网友评论

      • 何康老鬼:今天也被问到这个,回答的也很浅显,问我什么状态下用代理好,什么状态下用block好。:hushed:
      • 英俊神武:我觉得你回答挺好的,一般这个问题,我回答得都很浅。
      • f2503bba4cfa:block块内要把weak变成strong
      • YwWyW:单例不能用代理?
        YwWyW:@ChangeWorld 哈哈,我就是提醒一下
        ChangeWorld:@YwWyW 肯定是可以的,只要遵守了协议,谁都可以使用代理, "单例不能用代理"这是错误的认识,这篇文字是我初学iOS时网上copy的 , 网上的内容也不能全信,毕竟还是有坑存在的

      本文标题:协议代理,block的区别

      本文链接:https://www.haomeiwen.com/subject/iocgkttx.html