what is difference between NSNotification and protocol? (通知和協(xié)議的不同之處?)
我想大家都知道這個(gè)東西怎么用,但是更深層次的思考可能就比較少了吧,眾所周知就是代理是一對(duì)一的,但是通知是可以多對(duì)多的.但是為什么是這個(gè)樣子,有沒(méi)有更深的思考過(guò)這個(gè)問(wèn)題?
今天看了下網(wǎng)上的幾個(gè)視頻教程,KVO、KVC、謂詞、通知,算是開(kāi)發(fā)中的高級(jí)點(diǎn)的東西了。通知和協(xié)議都是類似于回調(diào)一樣,于是就在思考通知和協(xié)議到底有什么不同,或者說(shuō)什么時(shí)候該用通知,什么時(shí)候該用協(xié)議。
下面是網(wǎng)上摘抄的一段解釋:
協(xié)議有控制鏈(has-a)的關(guān)系,通知沒(méi)有。首先我一開(kāi)始也不太明白,什么叫控制鏈(專業(yè)術(shù)語(yǔ)了~)。但是簡(jiǎn)單分析下通知和代理的行為模式,我們大致可以有自己的理解簡(jiǎn)單來(lái)說(shuō),通知的話,它可以一對(duì)多,一條消息可以發(fā)送給多個(gè)消息接受者。代理按我們的理解,到不是直接說(shuō)不能一對(duì)多,比如我們知道的明星經(jīng)濟(jì)代理人,很多時(shí)候一個(gè)經(jīng)濟(jì)人負(fù)責(zé)好幾個(gè)明星的事務(wù)。只是對(duì)于不同明星間,代理的事物對(duì)象都是不一樣的,一一對(duì)應(yīng),不可能說(shuō)明天要處理A明星要一個(gè)發(fā)布會(huì),代理人發(fā)出處理發(fā)布會(huì)的消息后,別稱B的發(fā)布會(huì)了。但是通知就不一樣,他只關(guān)心發(fā)出通知,而不關(guān)心多少接收到感興趣要處理。因此控制鏈(has-a從英語(yǔ)單詞大致可以看出,單一擁有和可控制的對(duì)應(yīng)關(guān)系。
1.通知:
通知需要有一個(gè)通知中心:NSNotificationCenter,自定義通知的話需要給一個(gè)名字,然后監(jiān)聽(tīng)。
優(yōu)點(diǎn):通知的發(fā)送者和接受者都不需要知道對(duì)方??梢灾付ń邮胀ㄖ木唧w方法。通知名可以是任何字符串。
缺點(diǎn):較鍵值觀察(KVO)需要多點(diǎn)代碼,在刪掉前必須移除監(jiān)聽(tīng)者。
2.協(xié)議
通過(guò)setDelegate來(lái)設(shè)置代理對(duì)象,最典型的例子是常用的TableView.
優(yōu)點(diǎn):支持它的類有詳盡和具體信息。
缺點(diǎn):該類必須支持委托。某一時(shí)間只能有一個(gè)委托連接到某一對(duì)象。
相信看到這些東西,認(rèn)真思考一下,就可以知道在那種情況下使用通知,在那種情況下使用代理了吧.