delegate針對one-to-one關系,並且reciever可以返回值給sender;
notification 可以針對one-to-one/many/none,reciever無法返回值給sender;
所以,delegate用於sender希望接受到reciever的某個功能反饋值,notification用於通知多個object某個事件。
delegate主動,notification被動
1.
Delegate:
消息的發送者(sender)告知接收者(receiver)某個事件將要發生,delegate同意然後發送者響應事件,delegate機制使得接收者可以改變發送者的行為。通常發送者和接收者的關系是直接的一對多的關系。
Notification:
消息的發送者告知接收者事件已經發生或者將要發送,僅此而已,接收者並不能反過來影響發送者的行為。通常發送者和接收者的關系是間接的多對多關系。
2.
很早stepwise上有一篇很經典的文章抓沒講delegate和notificationde的區別的,不過很遺憾現在stepwise下線了。
簡單說,
1. 效率肯定是delegate比nsnotification高。
2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要關注返回值,也就是delegate方法的結果。比如-windowShouldClose:,需要關心返回的是yes還是no。所以delegate方法往往包含should這個很傳神的詞。也就是好比你做我的delegate,我會問你我想關閉窗口你願意嗎?你需要給我一個答案,我根據你的答案來決定如何做下一步。相反的,notification最大的特色就是不關心接受者的態度,我只管把通告放出來,你接受不接受就是你的事情,同時我也不關心結果。所以notification往往用did這個詞匯,比如NSWindowDidResizeNotification,那麼nswindow對象放出這個notification後就什麼都不管了也不會等待接受者的反應。