代理和通知的區(qū)別
- 效率:代理比通知高;
- 關(guān)聯(lián):delegate是強(qiáng)關(guān)聯(lián),委托和代理雙方互相知道。通知是弱關(guān)聯(lián),不需要知道是誰(shuí)發(fā),也不需要知道是誰(shuí)接收。
- 代理是一對(duì)一的關(guān)系,通知是一對(duì)多的關(guān)系。delegate一般是行為需要?jiǎng)e人來(lái)完成。通知是全局通知。
- 代理要實(shí)現(xiàn)對(duì)多個(gè)類發(fā)出消息可以通過(guò)將代理者添加入集合類后遍歷,或通過(guò)消息轉(zhuǎn)發(fā)來(lái)實(shí)現(xiàn)。
KVO和通知的區(qū)別
- 相同:都是一對(duì)多的關(guān)系;
- 不同:通知是需要被觀察者先主動(dòng)發(fā)出通知,觀察者注冊(cè)監(jiān)聽(tīng)再響應(yīng),比KVO多了發(fā)送通知這一步。
- 監(jiān)聽(tīng)范圍:KVO是監(jiān)聽(tīng)一個(gè)值的變化。通知不局限于監(jiān)聽(tīng)屬性的變化,還可以對(duì)多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽(tīng),監(jiān)聽(tīng)范圍廣,使用更靈活。
- 使用場(chǎng)景:KVO的一般使用場(chǎng)景是監(jiān)聽(tīng)數(shù)據(jù)變化,通知是全局通知。
block和代理的區(qū)別
相同點(diǎn):block和代理都是回調(diào)的方式。使用場(chǎng)景相同。
不同點(diǎn):
- block集中代碼塊,而代理分散代碼塊。所以block更適用于輕便、簡(jiǎn)單的回調(diào),如網(wǎng)絡(luò)傳輸。
代理適用于公共接口較多的情況,這樣做也更易于解耦代碼架構(gòu)。 - block運(yùn)行成本高。block出棧時(shí),需要將使用的數(shù)據(jù)從棧內(nèi)存拷貝到堆內(nèi)存。當(dāng)然如果是對(duì)象就是加計(jì)數(shù),使用完或block置為nil后才消除。
代理只是保存了一個(gè)對(duì)象指針,直接回調(diào),并沒(méi)有額外消耗。相對(duì)C的函數(shù)指針,只是多做了一個(gè)查表動(dòng)作。
KVO的使用
- 被觀察者發(fā)出 addObserver:forKeyPath:options:context: 方法來(lái)添加觀察者。
- 觀察者里實(shí)現(xiàn)observeValueForKeyPath:ofObject:change:context:來(lái)監(jiān)聽(tīng)被觀察者的keypath值變化
- 特點(diǎn):觀察者和被觀察者完全解耦,運(yùn)用很靈活簡(jiǎn)便。
KVO的注意事項(xiàng):
- KVO只能檢測(cè)類中的屬性,并且屬性名都是通過(guò)NSString來(lái)查找,編譯器不會(huì)幫你檢錯(cuò)和補(bǔ)全,純手敲比較容易出錯(cuò)。
通知的使用
- 通知由通知中心統(tǒng)一發(fā)出,根據(jù)通知name區(qū)分通知。
- 誰(shuí)要監(jiān)聽(tīng)某個(gè)name事件,就注冊(cè)名為name的監(jiān)聽(tīng)[[NSNotificationCenter defaultCenter]addObserver:selector:name:object: ]。收到名為name的通知后,在selector里響應(yīng)。
- 特點(diǎn):需要被觀察者主動(dòng)發(fā)出通知,觀察者注冊(cè)監(jiān)聽(tīng)后再進(jìn)行響應(yīng)。比KVO多了發(fā)通知這一步。
- 優(yōu)點(diǎn):不局限于屬性的變化,可以對(duì)多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽(tīng),監(jiān)聽(tīng)范圍廣,使用更靈活。
實(shí)現(xiàn)代理需要注意什么?
委托方:
- 委托者代理屬性的修飾詞要用weak;
- 調(diào)用代理方法時(shí),要先檢查代理屬性是否為空,并且是否實(shí)現(xiàn)了代理方法;
代理方:
- 包含委托方的頭文件;
- 遵循協(xié)議;
- 實(shí)現(xiàn)代理方法。
協(xié)議和代理的理解
協(xié)議
- 協(xié)議是一個(gè)方法簽名的列表,
- 可以定義多個(gè)方法。
- 根據(jù)配置,遵守該協(xié)議的類會(huì)去實(shí)現(xiàn)這個(gè)協(xié)議中規(guī)定的若干方法。
協(xié)議:用來(lái)規(guī)定代理雙方可做什么,必須做什么。
代理:根據(jù)指定的協(xié)議,完成委托方需要實(shí)現(xiàn)的功能。
委托:根據(jù)規(guī)定協(xié)議,指定代理去完成什么功能。