代理
优点:
1.代理语法清晰,可读性高,易于维护
2.它减少代码耦合性,使事件监听与事件处理分离
3.一个控制器可以实现多个代理,满足自定义开发需求,灵活性较高
缺点:
1.实现代理的过程较繁琐
2.跨层传值时加大代码的耦合性,并且程序的层次结构也变得混乱
3.当多个对象同时传值时不易区分,导致代理易用性大大降低
Block
Block封装一段代码,并当作变量进行传递,它十分方便地将不同地方的代码组织在一起,可读性高
优点:
1.语法简洁,代码可读性和维护性较高
2.配合GCD优秀的解决多线程问题
缺点:
1.Block中得代码将自动进行一次retain操作,容易造成内存泄漏
2.Block内默认引用为强引用,容易造成循环应用
通知
代理是一对一的关系,通知是一对多的关系,通知相比代理可以实现更大跨度的通信机制,但接收对象多了,就难以控制,有时不希望的对象也接收处理了信息
优点:
1.使用简单,代码精简
2.支持一对多,解决同时向多个对象监听的问题
3.传值方便快捷,context自带携带相应的内容
缺点:
1.通知使用完毕后需要注销,否则会造成意外崩溃
2.key不够安全,编译器不会检测到是否被通知中心处理
3.调试时难以跟踪
4.当使用者向通知中心发送通知的时候,并不能获得任何反馈信息
5.需要一个第三方的对象来做监听与被监听者的中介
Block和Delegate的区别?
delegate运行成本低,block成本高
block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置 nil 后才消除;delegate只是保存了一个对象指针,直接回调,没有额外消耗,相对C的函数指针,只做了一个查表的动作
Delegate:
1.“一对一”,对同一个协议,一个对象只能设置一个代理delegate,单例对象就不能用代理这是不对的,任何人,任何对象,只要接受,只要运行,只要遵守了相关的协议,他就可以使用代理
2.代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始,是否收到了数据,数据是否已经接受完成、数据接收失败
Block:
1.写法更简练,不需要Protocol、函数等
2.block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
3.Block需要注意防止循环引用:
ARC下:
__weak typeof(self) weakSelf = self;
[your Block:^(NSArray *repeatedArray,NSArray *incompleteArray){
[weakSelf doSomething];
}];
非ARC:
__block typeof(self) weakSelf = self;
[your Block:^(NSArray *repeatedArray,NSArray *incompleteArray){
[weakSelf doSomething];
}];
什么时候用代理,什么时候用Block
公共接口,方法较多也选择用delegate进行解耦
iOS有很多例子,比如最常用tableViewDelegate,textViewDelegate
异步和简单的回调用block更高
iOS有很多例子比如常用的网络库AFNetworking,ASIHttps库,UIAlertView类等