天天看點

代理、nsnotification和kvo的差別和用法

個人在網上浏覽一些文檔發現蠻有意思的,現轉載下來供大家學習檢視。

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