delegate, Notification,KVO优缺点?

平时在开发中,经常会遇到不同的类之间进行通信,我们平时会有以下几种选择:

1.delegate

2.Notification

3.KVO

特点如下:

delegate:

1.语法严格,定义清晰。如协议的定义实现。

2.逻辑清楚,控制流程可跟踪和识别。

3.一个类中可以定义多个协议,每个协议对应不同的delegate.

4.定义代码比较多,如协议,delegate属性,代理方法的实现。

5.一对一通信。

notification:

1.不需要写多少代码,实现比较简单。

2.一个对象发出的通知,多个对象能进行反应,一对多的方式实现很简单。

3.在编译期不会检查通知是否能够被观察者正确的处理; 

4.在释放注册的对象时,需要在通知中心取消注册;

5.在调试的时候应用的工作以及控制过程难跟踪;

6.需要第三方对象来管理controller与观察者对象之间的联系;

7.controller和观察者需要提前知道通知名称、UserInfo dictionary keys。如果这些没有在工作区间定义,那么会出现不同步的情况;

8.通知发出后,controller不能从观察者获得任何的反馈信息(相比较delegate)。

KVO 

1.能够提供一种简单的方法实现两个对象间的同步。例如:modelview之间同步;

2.能够对非我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SKD对象)的实现;

3.能够提供观察的属性的最新值以及先前值;

4.key paths来观察属性,因此也可以观察嵌套对象;

5.完成了对观察对象的抽象,因为不需要额外的代码来允许观察值能够被观察

6.可以一对多。

7.我们观察的属性必须使用strings来定义。因此在编译器不会出现警告以及检查;

8.对属性重构将导致我们的观察代码不再可用;

9.复杂的“IF”语句要求对象正在观察多个值。这是因为所有的观察代码通过一个方法来指向;

10.当释放观察者时不需要移除观察者。

 

 根据以上的特点,就可以看出它们之间的区别

1.delegate比NSNotification/KVO效率高,更加直接。

2、KVO和NSNotification这两个都是负责发出通知,剩下的事情就不管了,没有返回值,delegate可以有返回值。

3.delegate只是一对一,KVO和NSNotification可以一对多。

总结:当处理属性层的消息的事件时候,使用KVO,其他的尽量使用delegate,如果代码处理的东西确实很简单,那么用NSNotification会方便些。

原文地址:https://www.cnblogs.com/menchao/p/5189456.html