KVC, KVO 實現原理

2022-05-07 09:06:08 字數 2538 閱讀 2245

方法呼叫: 

//

物件屬性

//類似: person -> name

setvalue: forkey:

//物件的屬性或者 屬性的屬性...... 可見它已經包含前者.

//類似: person -> car -> name

setvalue: forkeypath:

kvc運用了乙個isa-swizzling技術. isa-swizzling就是型別混合指標機制, 將2個物件的isa指標互相調換, 就是俗稱的黑魔法.

kvc主要通過isa-swizzling, 來實現其內部查詢定位的. 預設的實現方法由nsoject提供

isa指標, 如其名稱所指,(就是is a kind of的意思), 指向分發表物件的類. 該分發表實際上包含了指向實現類中的方法的指標, 和其它資料。

比如說如下的一行kvc的**:

[object setvalue:@"

134567

" forkey:@"

uid"

];就會被編譯器處理成:

//首先找到對應sel

sel sel = sel_get_uid("

setvalue:forkey:");

//根據object->isa找到sel對應的imp實現指標

imp method = objc_msg_lookup (object->isa,sel);

//呼叫指標完成kvc賦值

method(object, sel, @"

134567

", @"

uid");

kvc鍵值查詢原理

setvalue:forkey:搜尋方式

1

、首先搜尋setkey:方法.(key指成員變數名, 首字母大寫)

2、上面的setter方法沒找到, 如果類方法accessinstancevariablesdirectly返回yes. 那麼按 _key, _iskey,key, iskey的順序搜尋成員名.(nskeyvaluecodingcatogery中實現的類方法, 預設實現為返回yes)

3、如果沒有找到成員變數, 呼叫setvalue:forunderfinedkey:

valueforkey:的搜尋方式

1

、首先按getkey, key, iskey的順序查詢getter方法, 找到直接呼叫. 如果是bool、int等內建值型別, 會做nsnumber的轉換.

2、上面的getter沒找到, 查詢countofkey, objectinkeyatindex, keyatindexes格式的方法. 如果countofkey和另外兩個方法中的乙個找到, 那麼就會返回乙個可以響應nsarray所有方法的**集合的nsarray訊息方法.

3、還沒找到, 查詢countofkey, enumeratorofkey, memberofkey格式的方法. 如果這三個方法都找到, 那麼就返回乙個可以響應nsset所有方法的**集合.

4、還是沒找到, 如果類方法accessinstancevariablesdirectly返回yes. 那麼按 _key, _iskey, key, iskey的順序搜尋成員名.

5、再沒找到, 呼叫valueforundefinedkey.

觀察者思想: 

乙個目標物件管理所有依賴於它的觀察者物件,並在它自身的狀態改變時主動通知觀察者物件。這個主動通知通常是通過呼叫各觀察者物件所提供的介面方法來實現的。觀察者模式較完美地將目標物件與觀察者物件解耦。
方法呼叫

//

新增乙個觀察者

[self.object addobserver:self forkeypath:@"

uid" options:nskeyvalueobservingoptionold|nskeyvalueobservingoptionnew context:nil];

// 觀察者監聽到之後**方法

- (void)observevalueforkeypath:(nsstring *)keypath ofobject:(id)object change:(nsdictionaryid> *)change context:(void *)context

//移除觀察者, 類在銷毀前需要銷毀

[self.object removeobserver:self forkeypath:@"

uid"];

由此可見, 只有當我們呼叫kvc去訪問key值的時候kvo才會起作用. 所以肯定確定的是, kvo是基於kvc實現的, 

系統實現kvo有以下幾個步驟:

下面就是在呼叫kvo過程中object物件的isa指標指向

在沒有新增觀察者之前 isa 指向的是student類

在新增完觀察者之後, isa指標指向了nskvonotifying_student類, 所以能肯定nskvonotifying_student 是後來被建立出來作為監聽用的

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的意思 指向維護分發表的物件的類。該分發表實際上包含了指向實現類中的方法的指標,...

KVC KVO的實現原理簡述

kvc全稱為key value coding,鍵值編碼。就是提供了一種機制可以訪問乙個物件的任意屬性。它是通過使用字串作為關鍵字而不是使用setter getter訪問器去訪問乙個物件例項的屬性的機制。問題 kvc是如何訪問屬性的 1 如果是取值操作,檢查是否存在 is,或者 get的對應key的訪...