NSNotification、delegate和KVO優(yōu)缺點對比

Copyright ? 2017年ZaneWangWang. All rights reserved.

一.Delegate(代理)

1).優(yōu)勢:

a.有非常嚴格的語法,所有觸發(fā)代理的方法在代理中有清晰的定義

b.如果代理中的一個必要方法沒有實現(xiàn)會出現(xiàn)編譯警告

c.整個觸發(fā)和調(diào)用的控制流程可跟蹤并且可識別,通信過程清晰明了

2).缺點

a.需要定義很多代碼:協(xié)議定義;遵循代理的delegate屬性;在遵循delegate對象實現(xiàn)中實現(xiàn)delegate方法定義

b.在釋放代理對象時,需要小心的將delegate改為nil。一旦設定失敗,那么調(diào)用釋放對象的方法將會出現(xiàn)內(nèi)存crash

二.NSNotification(通知)

1).優(yōu)勢:

a.不需要編寫多少代碼,實現(xiàn)比較簡單;

b.對于一個發(fā)出的通知,多個對象能夠做出反應,即1對多的方式實現(xiàn)簡單

c.發(fā)送通知的時候可以傳遞context對象(dictionary),context對象攜帶了關于發(fā)送通知的自定義的信息

2).缺點:

a.在編譯期不會檢查通知是否能夠被觀察者正確的處理;

b.在釋放注冊的對象時,需要在通知中心取消注冊;

c.在調(diào)試的時候應用的工作以及控制過程難跟蹤;

d.通知發(fā)出后,不能從觀察者獲得任何的反饋信息。

三.KVO(鍵值監(jiān)聽)

1).優(yōu)勢:

a.能夠提供一種簡單的方法實現(xiàn)兩個對象間的同步。例如:model和view之間同;

b.能夠對非我們創(chuàng)建的對象,即內(nèi)部對象的狀態(tài)改變作出響應,而且不需要改變內(nèi)部對象(SKD or 對象)的實現(xiàn);

c.能夠提供觀察的屬性的最新值以及先前值;

d.用key paths來觀察屬性,因此也可以觀察嵌套對象;

e.完成了對觀察對象的抽象,因為不需要額外的代碼來允許觀察值能夠被觀察

2).缺點:

a.我們觀察的屬性必須使用strings來定義。因此在編譯器不會出現(xiàn)警告以及檢查

b.對屬性重構將導致我們的觀察代碼不再可用

總結:

1.效率肯定是delegateNSNotification高。

delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要關注返回值,也就是delegate方法的結果。比如-windowShouldClose:,需要關心返回的是yes還是no。所以delegate方法往往包含should這個很傳神的詞。也就是好比你做我的delegate,我會問你我想關閉窗口你愿意嗎?你需要給我一個答案,我根據(jù)你的答案來決定如何做下一步。相反的,notification最大的特色就是不關心接受者的態(tài)度,我只管把通告放出來,你接受不接受就是你的事情,同時我也不關心結果。所以notification往往用did這個詞匯,比如NSWindowDidResizeNotification,那么NSWindow對象放出這個notification后就什么都不管了也不會等待接受者的反應。

2、KVONSNotification的區(qū)別:

和delegate一樣,KVO和NSNotification的作用也是類與類之間的通信,與delegate不同的是這兩個都是負責發(fā)出通知,剩下的事情就不管了,所以沒有返回值;delegate只是一對一,而這兩個可以一對多。這兩者也有各自的特點。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容