Copyright ? 2017年ZaneWangWang. All rights reserved.
一.Delegate(代理)
1).優(yōu)勢(shì):
a.有非常嚴(yán)格的語法,所有觸發(fā)代理的方法在代理中有清晰的定義
b.如果代理中的一個(gè)必要方法沒有實(shí)現(xiàn)會(huì)出現(xiàn)編譯警告
c.整個(gè)觸發(fā)和調(diào)用的控制流程可跟蹤并且可識(shí)別,通信過程清晰明了
2).缺點(diǎn)
a.需要定義很多代碼:協(xié)議定義麸拄;遵循代理的delegate屬性;在遵循delegate對(duì)象實(shí)現(xiàn)中實(shí)現(xiàn)delegate方法定義
b.在釋放代理對(duì)象時(shí)实柠,需要小心的將delegate改為nil橱脸。一旦設(shè)定失敗抒和,那么調(diào)用釋放對(duì)象的方法將會(huì)出現(xiàn)內(nèi)存crash
二.NSNotification(通知)
1).優(yōu)勢(shì):
a.不需要編寫多少代碼膳沽,實(shí)現(xiàn)比較簡(jiǎn)單汗菜;
b.對(duì)于一個(gè)發(fā)出的通知,多個(gè)對(duì)象能夠做出反應(yīng)挑社,即1對(duì)多的方式實(shí)現(xiàn)簡(jiǎn)單
c.發(fā)送通知的時(shí)候可以傳遞context對(duì)象(dictionary)陨界,context對(duì)象攜帶了關(guān)于發(fā)送通知的自定義的信息
2).缺點(diǎn):
a.在編譯期不會(huì)檢查通知是否能夠被觀察者正確的處理;
b.在釋放注冊(cè)的對(duì)象時(shí)痛阻,需要在通知中心取消注冊(cè)菌瘪;
c.在調(diào)試的時(shí)候應(yīng)用的工作以及控制過程難跟蹤;
d.通知發(fā)出后阱当,不能從觀察者獲得任何的反饋信息俏扩。
三.KVO(鍵值監(jiān)聽)
1).優(yōu)勢(shì):
a.能夠提供一種簡(jiǎn)單的方法實(shí)現(xiàn)兩個(gè)對(duì)象間的同步。例如:model和view之間同弊添;
b.能夠?qū)Ψ俏覀儎?chuàng)建的對(duì)象录淡,即內(nèi)部對(duì)象的狀態(tài)改變作出響應(yīng),而且不需要改變內(nèi)部對(duì)象(SKD or 對(duì)象)的實(shí)現(xiàn)油坝;
c.能夠提供觀察的屬性的最新值以及先前值嫉戚;
d.用key paths來觀察屬性,因此也可以觀察嵌套對(duì)象免钻;
e.完成了對(duì)觀察對(duì)象的抽象彼水,因?yàn)椴恍枰~外的代碼來允許觀察值能夠被觀察
2).缺點(diǎn):
a.我們觀察的屬性必須使用strings來定義。因此在編譯器不會(huì)出現(xiàn)警告以及檢查
b.對(duì)屬性重構(gòu)將導(dǎo)致我們的觀察代碼不再可用
總結(jié):
1.效率肯定是delegate比NSNotification高极舔。
delegate方法比notification更加直接凤覆,最典型的特征是,delegate方法往往需要關(guān)注返回值拆魏,也就是delegate方法的結(jié)果盯桦。比如-windowShouldClose:慈俯,需要關(guān)心返回的是yes還是no。所以delegate方法往往包含should這個(gè)很傳神的詞拥峦。也就是好比你做我的delegate贴膘,我會(huì)問你我想關(guān)閉窗口你愿意嗎?你需要給我一個(gè)答案略号,我根據(jù)你的答案來決定如何做下一步刑峡。相反的,notification最大的特色就是不關(guān)心接受者的態(tài)度玄柠,我只管把通告放出來突梦,你接受不接受就是你的事情,同時(shí)我也不關(guān)心結(jié)果羽利。所以notification往往用did這個(gè)詞匯宫患,比如NSWindowDidResizeNotification,那么NSWindow對(duì)象放出這個(gè)notification后就什么都不管了也不會(huì)等待接受者的反應(yīng)这弧。
2娃闲、KVO和NSNotification的區(qū)別:
和delegate一樣,KVO和NSNotification的作用也是類與類之間的通信匾浪,與delegate不同的是這兩個(gè)都是負(fù)責(zé)發(fā)出通知皇帮,剩下的事情就不管了,所以沒有返回值户矢;delegate只是一對(duì)一玲献,而這兩個(gè)可以一對(duì)多。這兩者也有各自的特點(diǎn)梯浪。