NSNotification、delegate和KVO的区别

1.效率确定是delegate比nsnotification高。post

2. delegate方法比notification更加直接,最典型的特征是,delegate方法每每须要关注返回值, 也就是delegate方法的结果。好比-windowShouldClose:,须要关心返回的是yes仍是no。因此delegate方法每每包含 should这个很传神的词。也就是比如你作个人delegate,我会问你我想关闭窗口你愿意吗?你须要给我一个答案,我根据你的答案来决定如何作下一 步。相反的,notification最大的特点就是不关心接受者的态度, 我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。因此notification每每用did这个词汇,好比 NSWindowDidResizeNotification,那么nswindow对象放出这个notification后就什么都无论了也不会等待接 受者的反应。spa

简明概要的说明了KVO和NSNotification的区别orm

和delegate同样,KVO和NSNotification的做用也是类与类之间的通讯,与delegate不一样的是1)这两个都是负责发出通知,剩下的事情就无论了,因此没有返回值;2)delegate只是一对一,而这两个能够一对多。这二者也有各自的特色。server

1)KVO的使用:对象

被观察者发出  addObserver:forKeyPath:options:context:  方法来添加观察者。get

而后只要被观察者的keyPath值变化(注意:单纯改变其值不会调用此方法,只有经过getters和setters来改变值才会触发KVO),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:编译器

所以观察者须要实现方法 observeValueForKeyPath:ofObject:change:context: 来对KVO发出的通知作出响应。it

  • 这 些代码都只需在观察者里进行实现,被观察者不用添加任何代码,因此谁要监听谁注册,而后对响应进行处理便可,使得观察者与被观察者彻底解耦,运用很灵活很 简便;可是KVO只能检测类中的属性,而且属性名都是经过NSString来查找,编译器不会帮你检错和补全,纯手敲因此比较容易出错。io


  • 2)NSNotification的使用编译

  • 这里的通知不是由被观察者发出,而是由NSNotificationCenter来统一发出,而不一样通知经过惟一的通知标识名notificationName来区分,标识名由发送通知的类来起。

  • 首先被观察者本身在必要的方法A里,经过方法postNotificationName:object:来发出通知notificationName这样发送通知者这边的工做就完成了,每次A被调用,就会发送一次通知notificationName。

  • 而后谁要监听A的变化,就经过[NSNotificationCenter defaultCenter]的方法addObserver:selector:name:object:为观察者注册监听name为notificationName的通知而后每次发出name为notificationName的通知时,注册监听后的观察者就会调用其本身定义的方法notificationSelector来进行响应。

  • NSNotification的特色呢,就是须要被观察者先主动发出通知,而后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,可是其优势是监听不局限于属性的变化,还能够对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

相关文章
相关标签/搜索