NSNotification 和 KVO的区别和用法是什么?

一、两者的相同点:

1.NSNotification 和 KVO都是类与类之间的通信.
2.都是负责发出通知,剩下的事情就不管了,所以没有返回值.
3.两者都可以一对多.

二、两者的区别:

1.KVO的使用

(1). 被观察者发出 addObserver:forKeyPath:options:context: 方法来添加观察者.
(2).只要被观察者的keyPath值变化(注意:单纯改变其值不会调用此方法,只有通过getter和setter方法改变值才会触发KVO),就会在观察者里边调用方法observeValueForKeyPath:ofObject:change:context:,因此观察者需要实现方法observeValueForKeyPath:ofObject:change:context:来对KVO发出的通知做出响应.

注意事项:
  这些代码都只需在观察者里边进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,然后对响应进行处理即可,使得观察者与被观察者完全解耦,运用很灵活,很简单.
缺点:
 KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你去检测与补全,纯手敲可能比较容易出错.
2.NSNotification的使用
NSNotification的特点:

“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;

NSNotification的工作原理:

     通知不是由被观察者发出,而是NSNotificationCenter(通知中心)来统一发出的,而不同通知通过唯一的通知标识名notificationName来区分,标识名由发送通知的类来起.
首先被观察者自己在必要的方法A里,通过方法postNotificationName:object:来发出通知notificationName,这样发送通职者这边的工作就完成了,每次A被调用,就会发送一次通知notificationName. 然后谁要监听A的变化,就通过[NSNotificationCenter defaultCenter]的方法
addObserver:selector:name:object:为观察者注册监听name为notificationName的通知然后每次发出name为notificationName的通知时,注册监听后的观察者就会调用其自己定义的方法notificationSelector来进行响应.

NSNotification的特点:
  需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO 多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的装填变化进行监听,监听范围广,使用也更灵活.

你可能感兴趣的:(NSNotification 和 KVO的区别和用法是什么?)