iOS探究KVO底層并手寫KVO

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

1 kvo的使用

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

這些都是基本的kvo使用斧账,這里就不做過多介紹啦谴返。。咧织。

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

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

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

3 手動(dòng)實(shí)現(xiàn)kvo

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

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

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

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

3.重寫子類的set方法

4.發(fā)送通知

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

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

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


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

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


3独撇、重寫set方法


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

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

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

4、發(fā)送通知

首先我們要保存這個(gè)對(duì)象斩箫,方便在下面取到吏砂,然后我們?cè)趕etName方法里取到這個(gè)observer之后,用msgSend調(diào)用方法來發(fā)送通知乘客。

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


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

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

以后我會(huì)多多更新文章,方便大家互相學(xué)習(xí)技術(shù)满钟,覺得好的話記得關(guān)注我哦Jだ啤!湃番!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夭织,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吠撮,更是在濱河造成了極大的恐慌尊惰,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纬向,死亡現(xiàn)場離奇詭異择浊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逾条,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門琢岩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人师脂,你說我怎么就攤上這事担孔。” “怎么了吃警?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵糕篇,是天一觀的道長。 經(jīng)常有香客問我酌心,道長拌消,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任安券,我火速辦了婚禮墩崩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侯勉。我一直安慰自己鹦筹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布址貌。 她就那樣靜靜地躺著铐拐,像睡著了一般徘键。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上遍蟋,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天吹害,我揣著相機(jī)與錄音,去河邊找鬼匿值。 笑死赠制,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挟憔。 我是一名探鬼主播钟些,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绊谭!你這毒婦竟也來了政恍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤达传,失蹤者是張志新(化名)和其女友劉穎篙耗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宪赶,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宗弯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搂妻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒙保。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖欲主,靈堂內(nèi)的尸體忽然破棺而出邓厕,到底是詐尸還是另有隱情,我是刑警寧澤扁瓢,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布详恼,位于F島的核電站,受9級(jí)特大地震影響引几,放射性物質(zhì)發(fā)生泄漏昧互。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一伟桅、第九天 我趴在偏房一處隱蔽的房頂上張望硅堆。 院中可真熱鬧,春花似錦贿讹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春赊堪,著一層夾襖步出監(jiān)牢的瞬間面殖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工哭廉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脊僚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓遵绰,卻偏偏與公主長得像辽幌,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椿访,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

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