之前面试遇到有问这样的问题,我的回答可能比较片面,不够深入。
下面是我的回答(不善言谈的我):
“代理和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类。
网友评论