iOS 代理和通知

代理和通知的區(qū)別

  1. 效率:代理比通知高;
  2. 關(guān)聯(lián):delegate是強(qiáng)關(guān)聯(lián),委托和代理雙方互相知道。通知是弱關(guān)聯(lián),不需要知道是誰(shuí)發(fā),也不需要知道是誰(shuí)接收。
  3. 代理是一對(duì)一的關(guān)系,通知是一對(duì)多的關(guān)系。delegate一般是行為需要?jiǎng)e人來(lái)完成。通知是全局通知。
  4. 代理要實(shí)現(xiàn)對(duì)多個(gè)類發(fā)出消息可以通過(guò)將代理者添加入集合類后遍歷,或通過(guò)消息轉(zhuǎn)發(fā)來(lái)實(shí)現(xiàn)。

KVO和通知的區(qū)別

  1. 相同:都是一對(duì)多的關(guān)系;
  2. 不同:通知是需要被觀察者先主動(dòng)發(fā)出通知,觀察者注冊(cè)監(jiān)聽(tīng)再響應(yīng),比KVO多了發(fā)送通知這一步。
  3. 監(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)范圍廣,使用更靈活。
  4. 使用場(chǎng)景:KVO的一般使用場(chǎng)景是監(jiān)聽(tīng)數(shù)據(jù)變化,通知是全局通知。

block和代理的區(qū)別

相同點(diǎn):block和代理都是回調(diào)的方式。使用場(chǎng)景相同。
不同點(diǎn):

  1. block集中代碼塊,而代理分散代碼塊。所以block更適用于輕便、簡(jiǎn)單的回調(diào),如網(wǎng)絡(luò)傳輸。
    代理適用于公共接口較多的情況,這樣做也更易于解耦代碼架構(gòu)。
  2. 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的使用

  1. 被觀察者發(fā)出 addObserver:forKeyPath:options:context: 方法來(lái)添加觀察者。
  2. 觀察者里實(shí)現(xiàn)observeValueForKeyPath:ofObject:change:context:來(lái)監(jiān)聽(tīng)被觀察者的keypath值變化
  3. 特點(diǎn):觀察者和被觀察者完全解耦,運(yùn)用很靈活簡(jiǎn)便。

KVO的注意事項(xiàng):

  1. KVO只能檢測(cè)類中的屬性,并且屬性名都是通過(guò)NSString來(lái)查找,編譯器不會(huì)幫你檢錯(cuò)和補(bǔ)全,純手敲比較容易出錯(cuò)。

通知的使用

  1. 通知由通知中心統(tǒng)一發(fā)出,根據(jù)通知name區(qū)分通知。
  2. 誰(shuí)要監(jiān)聽(tīng)某個(gè)name事件,就注冊(cè)名為name的監(jiān)聽(tīng)[[NSNotificationCenter defaultCenter]addObserver:selector:name:object: ]。收到名為name的通知后,在selector里響應(yīng)。
  3. 特點(diǎn):需要被觀察者主動(dòng)發(fā)出通知,觀察者注冊(cè)監(jiān)聽(tīng)后再進(jìn)行響應(yīng)。比KVO多了發(fā)通知這一步。
  4. 優(yōu)點(diǎn):不局限于屬性的變化,可以對(duì)多種多樣的狀態(tài)變化進(jìn)行監(jiān)聽(tīng),監(jiān)聽(tīng)范圍廣,使用更靈活。

實(shí)現(xiàn)代理需要注意什么?

委托方:

  1. 委托者代理屬性的修飾詞要用weak;
  2. 調(diào)用代理方法時(shí),要先檢查代理屬性是否為空,并且是否實(shí)現(xiàn)了代理方法;

代理方:

  1. 包含委托方的頭文件;
  2. 遵循協(xié)議;
  3. 實(shí)現(xiàn)代理方法。

協(xié)議和代理的理解

協(xié)議

  1. 協(xié)議是一個(gè)方法簽名的列表,
  2. 可以定義多個(gè)方法。
  3. 根據(jù)配置,遵守該協(xié)議的類會(huì)去實(shí)現(xiàn)這個(gè)協(xié)議中規(guī)定的若干方法。

協(xié)議:用來(lái)規(guī)定代理雙方可做什么,必須做什么。

代理:根據(jù)指定的協(xié)議,完成委托方需要實(shí)現(xiàn)的功能。

委托:根據(jù)規(guī)定協(xié)議,指定代理去完成什么功能。

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

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