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多了發送通知的一步,可是其優勢是監聽不侷限於屬性的變化,還能夠對多種多樣的狀態變化進行監聽,監聽範圍廣,使用也更靈活。