KVO 實現(xiàn)原理

期初,這個是因為朋友說的,忘記是哪所大公司的筆試題,說 KVO 的實現(xiàn)為什么要創(chuàng)建一個子類。當(dāng)初,我還瞎說的做了一個回答,感覺這個也沒啥呢。隨著自己興趣使然,我就簡單搜索了一下,我天,鋪天蓋地的文獻(xiàn),才知道,原來這個也是個領(lǐng)域哦。

后來就慢慢的接觸、了解,也聽說了很多新詞,其中陌生的要屬 isa 指針了,因為當(dāng)初這個東西只是在打斷點的時候看過,但是從來不知道是干啥的,也沒有深究過,另外一個是 Runtime 機制,好像一下子就把這個天天用也天天不在意的 KVO 提高了很高很高的檔次,“有三四層樓那么高”—《功夫》!

然后,經(jīng)過了差不多一個月左右的專研,給 isa 算是弄懂了,Runtime 看不懂,雖然知道什么:動態(tài)的創(chuàng)建類、更改執(zhí)行的兩個方法、動態(tài)的增加類的方法(Category),還有什么消息發(fā)送機制什么的,但是始終一頭霧水。isa 我寫了一篇白話技術(shù)檔了,這里不再苦述。

那么,KVO 到底是啥子?用我們肯定會用,但是也保不齊用不好,不是忘記注冊就是忘記移除的,要么就是那個新舊值的枚舉都能寫錯的。暫且先算會用,比如一個類中的屬性增加了監(jiān)聽,然后在監(jiān)聽回調(diào)方法中完成事件處理。那么注冊監(jiān)聽的時候這個類都做了哪些事情呢?

首先、一個類的屬性被注冊了監(jiān)聽,那么就會:

創(chuàng)建一個類的元類,

創(chuàng)建一個類的元類,

創(chuàng)建一個類的元類,重要的事情說三遍,這里我必須要解釋一下,因為好多文章都管這個叫做了新類。元類也是類,這里會涉及 isa 指針,也正是這個指針的特性和這個“新類”弄得我一個多小時都想不明白。

第一、isa 指針指向元類,它并不是指向父類,這個必須要牢記。元類不是父類,元類中有類的方法。

第二、對象收到消息后,就會在對象本身查找實例的方法,如果沒有實現(xiàn)的方法,就會去找父類的元類,父類的元類就是父類的方法,子類繼承父類,也就間接等于去父類里找方法了,所以這里是一個閉環(huán)。

第三、實例的實例方法存在于實例的類中,類的類方法存在于類的元類中,元類的方法存在于根元類中。所以類、元類、根元類就是存比它小一級的實例的方法的。

牢記上面以后,我們再接著來。

一個類的屬性被注冊了監(jiān)聽,那么就會創(chuàng)建這個類的元類,同時將 isa 指針指向新的元類,取名大概是 NSKVONotifying_objectName ,objectName 就是你監(jiān)聽的那個類的名字,然后,重寫這個元類中的你監(jiān)聽的那個屬性的 setter 方法,當(dāng)有給類的屬性賦值的操作的時候,Runtime?就按照 isa 指針的指引去這個元類中尋找調(diào)用 setter 方法,然后發(fā)送通知。

至于發(fā)送通知和對象接收通知的實現(xiàn),那是關(guān)于 NSKeyValueObserving協(xié)議的履行,這里不做苦述。

最后編輯于
?著作權(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)容

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