深入理解 KVC KVO 實現機制 KVO

2022-07-07 14:36:16 字數 1196 閱讀 1414

kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa-swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文。 kvc實現機制傳送門

kvo概述

鍵值觀察key-value-observer就是觀察者模式。

當需要檢測其他類的屬性值變化,但又不想被觀察的類知道,有點像fbi監視嫌疑人,這個時候就可以使用kvo了。

kvo同kvc一樣都依賴於runtime的動態機制

kvo實現步驟

//keypath就是要觀察的屬性值

//options給你觀察鍵值變化的選擇

//context方便傳輸你需要的資料

-(void)addobserver:(nsobject *)anobserver

forkeypath:(nsstring *)keypath

options:(nskeyvalueobservingoptions)options

context:(void *)context

//change裡儲存了一些變化的資料,比如變化前的資料,變化後的資料;如果註冊時context不為空,這裡context就能接收到。

-(void)observevalueforkeypath:(nsstring *)keypath

ofobject:(id)object

change:(nsdictionary *)change

context:(void *)context

- (void)removeobserver:(nsobject *)observer forkeypath:(nsstring *)keypath;
kvo的實現分析

使用觀察者模式需要被觀察者的配合,當被觀察者的狀態發生變化的時候通過事先定義好的介面(協議)通知觀察者。在kvo的使用中我們並不需要向被觀察者新增額外的**,就能在被觀察的屬性變化的時候得到通知,這個功能是如何實現的呢?同kvc一樣依賴於強大的runtime機制。

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

kvo同kvc一樣,通過 isa-swizzling 技術來實現。當觀察者被註冊為乙個物件的屬性的觀察物件的isa指標被修改,指向乙個中間類,而不是在真實的類。其結果是,isa指標的值並不一定反映例項的實際類。

所以不能依靠isa指標來確定物件是否是乙個類的成員。應該使用class方法來確定物件例項的類。

深入理解 KVC KVO 實現機制 KVC

kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文 kvo實現機制傳送門 kvc概述 kvc使用 kvc鍵值查詢 搜尋單值成員 kvc實現分析 kvc運用了isa swizzing技術。isa swizzing就是型...

深入理解 KVC KVO 實現機制 KVC

深入理解 kvc kvo 實現機制 kvc kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文kvo實現機制傳送門 kvc概述 kvc使用 kvc鍵值查詢 搜尋單值成員 kvc實現分析 kvc運用了isa swizz...

深入理解 KVC KVO 實現機制 KVC

kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文 kvo實現機制傳送門 kvc概述 kvc使用 kvc鍵值查詢 搜尋單值成員1 首先搜尋setkey 方法。key指成員變數名,首字母大寫 2 上面的setter方法...