iOS探究KVO底層并手寫KVO

我們都知道蘋果的KVO可以為我們提供觀察屬性的方法,它可以實現(xiàn)監(jiān)聽屬性的改變并得到通知。既然蘋果沒有給我們開源,那我們就來自己琢磨一下它究竟是如何工作的。

1 kvo的使用

我們首先來寫一個非常簡單的kvo使用,當(dāng)點擊屏幕時,可以得到kvo通知回調(diào),并且打印這個屬性的新值。

這些都是基本的kvo使用,這里就不做過多介紹啦。。。

2 假設(shè)kvo的實現(xiàn)原理

那這里我們就要思考了,既然是觀察屬性的變化,那我們自然就會聯(lián)想到setter方法,蘋果可以重寫這個類的setter方法,并且使用willChangeValueForKey和DidChangeValueForKey方法來監(jiān)聽屬性并發(fā)送通知,當(dāng)然又不可能直接加在People類里面,那么會不會是動態(tài)創(chuàng)建了一個類,繼承這個People類,改變這個類的isa指針,并且重寫屬性的方法呢?既然有了思路,那就一起來試試看吧。

當(dāng)然這么說也不是沒有根據(jù)的,我們在kvo這句代碼打個斷點,就可以看到原本isa指針是People,而執(zhí)行完成addObserver后就isa指針就變成了 NSKVONotifying_People,所以我們知道剛才的假設(shè)是成立的,雖然我們不能完全知道kvo底層到底是怎么實現(xiàn)的,不過卻可以用所學(xué)知識來手動實現(xiàn)一個kvo。

3 手動實現(xiàn)kvo

既然要實現(xiàn)kvo這個方法,那么一定要有addObserver這個方法,通過Definition我們可以看到,addObserver這個方法是NSObject的一個分類。

那么我們也來模仿一下,給NSObject寫一個分類,這里我準(zhǔn)備分4步來實現(xiàn)。

1.創(chuàng)建被觀察者的子類

2.修改調(diào)用者isa指針

3.重寫子類的set方法

4.發(fā)送通知

1、創(chuàng)建被觀察者的子類

首先我們創(chuàng)建一個NSObject的分類,給這個分類添加一個方法,由于不能和已經(jīng)存在的addObserver方法重名,我就在addObserver中間加了個Kvo,來方便區(qū)別這個我們自己寫的方法。

然后在NSObject+kvo.m里面來實現(xiàn)這個方法


到這里,我們的子類就已經(jīng)創(chuàng)建好了

2、修改調(diào)用者isa指針其實只要一句話


3、重寫set方法


這里我們可以拿到這個屬性的新值,可是父類卻不知道這個新值,這時我們通過msgSend來給父類發(fā)送消息,調(diào)用setName方法,并把新的name傳過去

為了驗證這里的代碼是否正確,我在viewController里面調(diào)用一下,這里已經(jīng)把原有的addObserver方法注釋掉,調(diào)用了我們自己的addKvoObserver方法,結(jié)果顯然是有效果的。

那么現(xiàn)在子類生成了,新值拿到了,isa指針也修改過了,set方法也重寫了,只剩下要給外界發(fā)送通知了。

4、發(fā)送通知

首先我們要保存這個對象,方便在下面取到,然后我們在setName方法里取到這個observer之后,用msgSend調(diào)用方法來發(fā)送通知。

最后我們就可以在viewController里修改屬性,并且獲得通知了。


至此,我們的手寫kvo就已經(jīng)實現(xiàn)了。

第一次寫文章,沒有什么架構(gòu)和排版,希望大家湊合看,提出各種問題。。。。

以后我會多多更新文章,方便大家互相學(xué)習(xí)技術(shù),覺得好的話記得關(guān)注我哦?。?!

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

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,076評論 0 9
  • 本篇會對KVO的實現(xiàn)進(jìn)行探究,不涉及太多KVO的使用方法,但是會有一些使用時的思考。 一、使用上的疑問 1.key...
    奮拓達(dá)閱讀 572評論 0 2
  • 上半年有段時間做了一個項目,項目中聊天界面用到了音頻播放,涉及到進(jìn)度條,當(dāng)時做android時候處理的不太好,由于...
    DaZenD閱讀 3,102評論 0 26
  • 《招聘一個靠譜的 iOS》—參考答案(下) 說明:面試題來源是微博@我就叫Sunny怎么了的這篇博文:《招聘一個靠...
    YuWenHaiBo閱讀 4,164評論 0 16
  • 30多年前,本書作者之一羅伯特·西奧迪尼出版了《影響力》一書,并結(jié)合當(dāng)時的實證提出了六點普遍適用的說服原理。這些原...
    蕙茝_如常閱讀 995評論 0 2

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