你要知道的KVC、KVO、Delegate、Notification都在這里
轉(zhuǎn)載請(qǐng)注明出處 http://www.itdecent.cn/p/9215251693f0
本系列文章主要通過(guò)講解KVC、KVO、Delegate、Notification的使用方法,來(lái)探討KVO、Delegate、Notification的區(qū)別以及相關(guān)使用場(chǎng)景,本系列文章將分一下幾篇文章進(jìn)行講解,讀者可按需查閱。
- KVC 使用方法詳解及底層實(shí)現(xiàn)
- KVO 正確使用姿勢(shì)進(jìn)階及底層實(shí)現(xiàn)
- Protocol與Delegate 使用方法詳解
- NSNotificationCenter 通知使用方法詳解
- KVO、Delegate、Notification 區(qū)別及相關(guān)使用場(chǎng)景
KVO、Delegate、Notification 區(qū)別及相關(guān)使用場(chǎng)景
經(jīng)過(guò)前面四篇文章的學(xué)習(xí)我們已經(jīng)可以熟練使用KVO、Delegate和Notification了,但三者又有什么區(qū)別呢?
在實(shí)際開(kāi)發(fā)中需要在View和Controller之間進(jìn)行通信,也需要跨Controller進(jìn)行通信,上述三種方式都是為了通信而生,這三種方法都能夠減少耦合,使得View或是Controller能夠自包含,盡量不受其他對(duì)象的影響,這樣就能夠?qū)崿F(xiàn)盡可能的復(fù)用。
針對(duì)某一需求往往有不止一種實(shí)現(xiàn)方式,當(dāng)然上述三種方法也都可以互相替換,所以我認(rèn)為沒(méi)有百分百正確的使用方法或是百分百錯(cuò)誤的使用方法,只有合適和不合適的方法,我們盡量挑選最適合應(yīng)用程序開(kāi)發(fā)的方式來(lái)滿(mǎn)足我們的需求,接下來(lái)的內(nèi)容可能并不完全正確,僅僅是我的個(gè)人理解,如果錯(cuò)誤還請(qǐng)不吝賜教。
KVO
KVO在mac開(kāi)發(fā)中使用的非常頻繁,KVO提供了一個(gè)對(duì)象監(jiān)聽(tīng)另一個(gè)對(duì)象屬性值變化的方法,KVO適合多對(duì)一的監(jiān)聽(tīng),多個(gè)對(duì)象可以監(jiān)聽(tīng)同一個(gè)對(duì)象屬性值的變化,我們?cè)陂_(kāi)發(fā)中常用于監(jiān)聽(tīng)Model屬性值的變化從而動(dòng)態(tài)的更新視圖,它提供了一種模型屬性值一旦修改視圖可以立即按需求修改的功能,其優(yōu)點(diǎn)有:
- 創(chuàng)建監(jiān)聽(tīng)器的實(shí)現(xiàn)簡(jiǎn)單,只需要注冊(cè)后實(shí)現(xiàn)回調(diào)函數(shù)即可
- 能夠?qū)崿F(xiàn)多對(duì)一的監(jiān)聽(tīng),多個(gè)對(duì)象可同時(shí)監(jiān)聽(tīng)同一個(gè)對(duì)象屬性值的變化
- KVO提供了監(jiān)聽(tīng)新值以及舊值的方法,可以獲取到修改前的值
- 支持keyPath來(lái)監(jiān)聽(tīng)嵌套屬性值
- 支持context區(qū)分監(jiān)聽(tīng)器
但是經(jīng)過(guò)前面KVO文章的講解,我們也發(fā)現(xiàn)了其不少缺點(diǎn):
- 注冊(cè)監(jiān)聽(tīng)器和刪除監(jiān)聽(tīng)器必須成套出現(xiàn)
- 重復(fù)刪除監(jiān)聽(tīng)器會(huì)發(fā)生異常
- 監(jiān)聽(tīng)器對(duì)象銷(xiāo)毀前未刪除監(jiān)聽(tīng)器可能發(fā)生野指針異常
- 繼承類(lèi)的KVO處理較復(fù)雜
- keyPath為字符串類(lèi)型不能提供編譯器檢查
- 監(jiān)聽(tīng)的屬性值源碼的名稱(chēng)發(fā)生變化需要修改代碼
Delegate
在學(xué)習(xí)iOS開(kāi)發(fā)時(shí),我們最常用的應(yīng)該就是委托模式了,UITableView、UICollectionView等等,委托模式提供了兩種實(shí)現(xiàn)方式,一種是事件的代理,一種是數(shù)據(jù)源的代理,我們可以通知委托對(duì)象針對(duì)相關(guān)事件進(jìn)行響應(yīng),也可以從委托對(duì)象獲取想要的數(shù)據(jù),委托模式基于協(xié)議protocol實(shí)現(xiàn),提供了一種規(guī)范化的實(shí)現(xiàn)方式,并且delegate是一種一對(duì)一的實(shí)現(xiàn)方式,其優(yōu)點(diǎn)有:
- 基于協(xié)議實(shí)現(xiàn),提供了規(guī)范化的實(shí)現(xiàn)方法
- 在編譯期就能夠檢查是否實(shí)現(xiàn)了代理必須實(shí)現(xiàn)的方法
- 提供事件響應(yīng)的代理模式
- 提供數(shù)據(jù)源的代理模式
- 即時(shí)沒(méi)有委托對(duì)象也不會(huì)產(chǎn)生異常
其缺點(diǎn)有:
- 規(guī)范化帶來(lái)了實(shí)現(xiàn)上的復(fù)雜,必須遵守協(xié)議并實(shí)現(xiàn)所有方法
- 只能實(shí)現(xiàn)一對(duì)一的通信,如果多個(gè)對(duì)象都委托同一代理,為了區(qū)分不同的被委托對(duì)象,造成代碼的復(fù)雜化
NSNotificationCenter
NSNotificationCenter通知中心提供了一種多對(duì)一的通信方式,與KVO相同,多個(gè)監(jiān)聽(tīng)器對(duì)象可以同時(shí)監(jiān)聽(tīng)同一通知,能夠提供低耦合的實(shí)現(xiàn)方式,監(jiān)聽(tīng)器對(duì)象可以接收到通知的信息,但發(fā)送通知的對(duì)象實(shí)現(xiàn)了隱藏,無(wú)法得知具體的發(fā)送對(duì)象,iOS中很多系統(tǒng)控件都會(huì)發(fā)送相關(guān)通知,最常見(jiàn)的如鍵盤(pán),包括應(yīng)用程序的狀態(tài)等,其優(yōu)點(diǎn)有:
- 創(chuàng)建通知的監(jiān)聽(tīng)器簡(jiǎn)單,只需注冊(cè)后實(shí)現(xiàn)監(jiān)聽(tīng)放法即可
- 能夠?qū)崿F(xiàn)多對(duì)一的監(jiān)聽(tīng)
- 通過(guò)NSNotification的userInfo能夠傳遞通知的信息
- iOS9以后不需要手動(dòng)刪除監(jiān)聽(tīng)器對(duì)象也不會(huì)產(chǎn)生異常
其缺點(diǎn)有:
- 通知名稱(chēng)使用字符串類(lèi)型,在編譯器無(wú)法檢查
- 參數(shù)傳遞使用userInfo字典類(lèi)型,參數(shù)獲取需要規(guī)范定義
- 不能獲取發(fā)送通知對(duì)象的狀態(tài)信息
總結(jié)
從上面的優(yōu)缺點(diǎn)分析來(lái)看,三種方法都有各自的優(yōu)缺點(diǎn),因此,沒(méi)有正確與否,只有適不適合我們的需求,我在開(kāi)發(fā)中使用較多的是delegate和KVO,但KVO的使用過(guò)多后就會(huì)發(fā)現(xiàn)有些濫用,在某些情況下NSNotificationCenter更加適合,并且KVO在使用時(shí)必須非常小心的注冊(cè)和刪除監(jiān)聽(tīng)器。
備注
由于作者水平有限,難免出現(xiàn)紕漏,如有問(wèn)題還請(qǐng)不吝賜教。