KVC、KVO、NSNotification、delegate的基本概念和使用方法这里不再赘述,下文主要总结一下四者的优缺点。
一. KVC
- 优点
(1)可以直接通过字符串的名字(Key)来访问类属性或成员变量,而不是通过调用Setter方法、Getter方法进行访问;
(2)可以通过keyPath嵌套访问 - 缺点
(1)如果key只写错,编写的时候不会报错,但是运行的时候会报错
二. KVO
- 优点
(1)能够提供一种简单的方法实现两个对象的同步;
(2)能够对内部对象的状态改变作出响应,而且不需要改变内部对象的实现;
(3)能够提供被观察者属性的旧值和最新值;
(4)使用key Path来观察属性,因此可以观察嵌套对象;
(5)完成了对观察对象的抽象,因为不需要额外的代码来允许观察者被观察。 - 缺点
(1)它只能用来对属性作出反应,而不会用来对方法或者动作作出反应;
(2)观察的属性必须使用string来定义。因此在编译器不会出现警告以及检查;
(3)对属性重构将导致我们的观察代码不再可用;
(4)注意易出错和易crash的陷阱:https://www.cnblogs.com/Xylophone/p/6394051.html
a)当添加多个KVO时,注意对出发回调函数的来源进行判断;
b) 不能对不存在的属性进行kvo观测,否则会报crash;
c) 订阅者必须实现 observeValueForKeyPath:ofObject:change:context:方法,否则crash。
d)如果上述if条件不成立,即当前类无法捕捉到该KVO,但可能父类superClass可以捕获,所以注意在else后添加[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
e) 在dealloc中对KVO注销时,当对同一个keyPath进行两次removeObserver时会导致crash,这种情况常常出现在父类有一个kvo,父类在dealloc中remove了一次,子类又remove了一次的情况下。可以利用context字段来标识出到底kvo是superClass注册的,还是self注册的。我们可以分别在父类以及本类中定义各自的context字符串,然后在dealloc中remove observer时指定移除的自身添加的observer。这样就能避免二次remove造成crash;
f) 监听的前提是执行了 setter 方法、或者使用了 KVC 赋值;
三. NSNotification
- 优点
(1)一对多的实现方式简单;
(2)监听范围广,不局限于属性的变化(相比KVO),还可以对多种多样的状态变化进行监听,如键盘、前后台系统通知等 - 缺点
(1)notification 比 KVO 多了发送通知的一步。两者都是一对多,但是对象之间直接的交互,需要notificationCenter 来做为中间交互
四.delegate
- 优点
(1)非常严格的语法。所有回调事件必须是在delegate协议中有清晰的定义;
(2)在一个应用中的控制流程是可跟踪的并且是可识别的;
(3)没有第三方对象要求保持/监视通信过程; - 缺点
(1)通常是用于一对一,但是也可以实现一对多(多播委托,可通过设置中间层单例实现);
(2)在释放代理对象时,需要小心的将delegate改为nil。一旦设定失败,那么调用释放对象的方法将会出现内存crash
网友评论