协议代理,block的区别

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

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

“代理和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类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式 1.delegate和notification什么区别,什么情况使用? 2.描述一下KVO和KVC。 K...
    丶逐渐阅读 1,985评论 3 2
  • 通知 : “一对多”,”多对一” 传值 四个步骤: 1.发送通知 2.创建监听者 3.接收通知 4.移除监听者 使...
    lgvae阅读 563评论 0 6
  • 目录 属性 修饰词 循环引用 typeof与typedef 1. 属性 objc所有类和对象都是c结构体,cate...
    Ryan___阅读 360评论 0 1
  • 转自李峰峰博客 一、概述 闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」...
    Joshua520阅读 1,038评论 0 0
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,316评论 1 23