KVC KVO的實現原理簡述

2021-07-10 18:14:11 字數 1544 閱讀 7748

kvc全稱為key-value coding,鍵值編碼。就是提供了一種機制可以訪問乙個物件的任意屬性。它是通過使用字串作為關鍵字而不是使用setter/getter訪問器去訪問乙個物件例項的屬性的機制。

(問題:kvc是如何訪問屬性的)

(1)如果是取值操作,檢查是否存在-,-is,或者-get的對應key的訪問器方法,如果有則呼叫這些方法。

如果是設值操作,檢查是否存在-set方法,並使用它來進行屬性設值。對於get和set豈會遵循cocoa方法命名規範,把key首字元大寫,所以我們平時也要注意屬性和方法的命名規範!

(2)如上如方法不可用,則檢查是否存在對應的 -_,-_is,-_get和-_set方法。

(3)如果沒有找到訪問器方法,則嘗試直接訪問成員變數。其名一般為或_。

(4)如果仍未找到,則呼叫valueforundefinedkey:和setvalue:forundefinedkey方法。這兩個方法缺省會丟擲異常,我們也可以重寫這些方法進行對應情況的處理。

kvo全程為key-value observing,鍵值觀察。提供了一種當指定的物件的屬性發生變化時,則通知所有的觀察者的機制。通常用於model和controller之間。

(1)kvc和kvo都和一種叫isa-swizzling的技術有關,其依賴於runtime機制提供的強大動態能力。

(2)當某個類的例項第一次被觀察時,系統會在執行期間動態的建立乙個該類的派生類,在這個派生類會重寫父類中被觀察屬性的setter方法。

派生類中被重寫的setter方法實現了真正的通知機制。這麼做的原因是根據kvc的實現機制,我們會發現其修改屬性的實質就是通過呼叫屬性的訪問器進行的。所以如果遵循kvo的屬性設定方式來修改屬性值,就可以實現對屬性修改的觀察;否則的話,如果直接修改屬性對應的成員變數值,是無法實現kvo的。

(3)同時該派生類還重寫了class方法,以「欺騙」外部呼叫者,讓它們還以為它還是原來的那個類。然後系統將這個物件的isa指標指向這個派生類的class例項,其實際是這個例項早以成為派生類的物件了。所以使用者呼叫屬性的訪問器修改屬性時實際上是呼叫了派生類中重寫的setter方法,從而啟用了鍵值通知的機制。此外,派生類也重寫了dealloc方法來釋放資源。

派生類會在setter方法中增加兩個方法的呼叫。

- (void)willchangevalueforkey:(nsstring *)key  

- (void)didchangevalueforkey:(nsstring *)key

其中,會在didchangevalueforkey:裡呼叫觀察者的這個方法。

- (void)observevalueforkeypath:(nsstring *)keypath  

ofobject:(id)object

change:(nsdictionary *)change

context:(void *)context

以上就是kvo的實現原理了!

為了喚醒鍵值觀察(kvo),也可以手動呼叫will/didchangevalueforkey。

kvc/kvo原理詳解及程式設計指南

KVC, KVO 實現原理

方法呼叫 物件屬性 類似 person name setvalue forkey 物件的屬性或者 屬性的屬性.可見它已經包含前者.類似 person car name setvalue forkeypath kvc運用了乙個isa swizzling技術.isa swizzling就是型別混合指標機...

KVC, KVO實現原理

key value coding kvc顧名思義就是鍵值編碼,通過 setvalue value forkey key 來新增一組物件,編譯器會把這行 處理為sel sel sel get uid setvalue forkey imp method objc msg lookup site isa...

kvo實現原理 KVC KVO實現原理

一 kvc運用了乙個isa swizzling技術。isa swizzling就是型別混合指標機制。kvc主要通過isa swizzling,來實現其內部查詢定位的。isa指標,如其名稱所指,就是is a kind of的意思 指向維護分發表的物件的類。該分發表實際上包含了指向實現類中的方法的指標,...