個人在網上浏覽一些文檔發現蠻有意思的,現轉載下來供大家學習檢視。
1.效率肯定是
delegate
比
nsnotification
高。
2.
delegate
方法比
notification
更加直接。
最典型的特征是,方法往往需要關注傳回值, 也就是
delegate
方法的結果。比如
delegate
,需要關心傳回的是
-windowShouldClose:
還是
yes
。 是以
no
方法往往包含
delegate
這個很傳神的詞。也就是好比你做我的
should
delegate
,我會問你我想關閉視窗你願意嗎?你需要給我一個答案,我根據你的答案來決定如何做下一 步。
相反的,
最大的特色就是不關心接受者的态度, 我隻管把通告放出來,你接受不接受就是你的事情,同時我也不關心結果。是以
notification
往往用
notification
這個詞彙,比如
did
,那麼
NSWindowDidResizeNotification
對象放出這個
nswindow
後就什麼都不管了也不會等待接 受者的反應。
notification
簡明概要的說明了
KVO
和
NSNotification
的差別:
和
delegate
一樣,
KVO
和
NSNotification
的作用也是類與類之間的通信,與
delegate
不同的是:
1)這兩個都是負責發出通知,剩下的事情就不管了,是以沒有傳回值;
2)
delegate
隻是一對一,而這兩個可以一對多。這兩者也有各自的特點。
1)KVO的使用:
被觀察者發出
addObserver:forKeyPath:options:context:
方法來添加觀察者。
然後隻要被觀察者的
keyPath
值變化(注意:單純改變其值不會調用此方法,隻有通過
getters
和
setters
來改變值才會觸發
KVO
),就會在觀察者裡調用方法
observeValueForKeyPath:ofObject:change:context:
是以觀察者需要實作方法
observeValueForKeyPath:ofObject:change:context:
來對KVO發出的通知做出響應。
這 些代碼都隻需在觀察者裡進行實作,被觀察者不用添加任何代碼,是以誰要監聽誰注冊,然後對響應進行處理即可,使得觀察者與被觀察者完全解耦,運用很靈活很 簡便;但是
KVO
隻能檢測類中的屬性,并且屬性名都是通過
NSString
來查找,編譯器不會幫你檢錯和補全,純手敲是以比較容易出錯。
2)NSNotification的使用
這裡的通知不是由被觀察者發出,而是由
NSNotificationCenter
來統一發出,而不同通知通過唯一的通知辨別名
notificationName
來區分,辨別名由發送通知的類來起。
首先被觀察者自己在必要的方法
A
裡,通過方法
postNotificationName:object:
來發出通知
notificationName
這樣發送通知者這邊的工作就完成了,每次
A
被調用,就會發送一次通知
notificationName
。
然後誰要監聽
A
的變化,就通過
[NSNotificationCenter defaultCenter]
的方法
addObserver:selector:name:object:
為觀察者注冊監聽
name
為
notificationName
的通知然後每次發出
name
為
notificationName
的通知時,注冊監聽後的觀察者就會調用其自己定義的方法
notificationSelector
來進行響應。
NSNotification
的特點呢,就是需要被觀察者先主動發出通知,然後觀察者注冊監聽後再來進行響應,比
KVO
多了發送通知的一步,但是其優點是監聽不局限于屬性的變化,還可以對多種多樣的狀态變化進行監聽,監聽範圍廣,使用也更靈活。
原文位址:http://www.zybang.com/question/7de351204a7e746dfafe75ec083b4b78.html