i0SiOS面试Objective-C之代理协议通知

协议代理,block的区别

2016-02-28  本文已影响3185人  ChangeWorld

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读