kvo實現原理 KVC KVO實現原理

2021-10-13 08:33:25 字數 1969 閱讀 1263

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

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

[site setvalue:@"sitename" forkey:@"name"];

就會被編譯器處理成:

sel sel = sel_get_uid ("setvalue:forkey:");

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

method(site, sel, @"sitename", @"name");

首先介紹兩個基本概念:

(1)sel資料型別:它是編譯器執行objective-c裡的方法的環境引數。

(2)imp資料型別:他其實就是乙個編譯器內部實現時候的函式指標。當objective-c編譯器去處理實現乙個方法的時候,就會指向乙個imp物件,這個物件是c語言表述的型別。

kvc再某種程度上提供了訪問器的替代方案。不過訪問器方法是乙個很好的東西,以至於只要是有可能,kvc也盡量再訪問器方法的幫助下工作。為了設定或者返回物件屬性,kvc按順序使用如下技術:

1)檢查是否存在名為-set:的方法,並使用它做設定值。對於-get和-set:方法,將大寫key字串的第乙個字母,並與cocoa的方法命名保持一致;

2)如果上述方法不可用,則檢查名為-_、-_is(只針對布林值有效)、-_get和-_set:方法;

3)如果沒有找到訪問器方法,可以嘗試直接訪問例項變數。例項變數可以是名為:或_;

4)如果仍為找到,則呼叫valueforundefinedkey:和setvalue:forundefinedkey:方法。這些方法的預設實現都是丟擲異常,我們可以根據需要重寫它們。

二、kvo是基於kvc實現的,看下面的**:

#pragma mark - kvo實現原理

person *person = [[person alloc] init];

[person setname:@"jacedy"];

// 設定監聽

[person addobserver:self forkeypath:@"name" options:nskeyvalueobservingoptionold | nskeyvalueobservingoptionnew context:nil];

[person setname:@"jack"];

self.person = person;

// 響應監聽

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

nslog(@"%@ 物件的 %@ 屬性改變了:%@", object, keypath, change);

- (void)dealloc

// 移除監聽

[self.person removeobserver:self forkeypath:@"name"];

對**進行斷點跟蹤發現如下:

當新增了監聽後:

不難發現,person物件的isa指標由person變成了nskvonotifying_perosn。其實,當某個類的物件第一次被觀察時,系統就會在執行期動態地建立該類的乙個派生類,在這個派生類中重寫基類中任何被觀察屬性的 setter 方法。派生類在被重寫的 setter 方法實現真正的通知機制:

- (void)setname:(nsstring *)name

[super setname:name];

[*** observevalueforkeypath:@"name"  ofobject:self  change:@{}  context:nil];

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...

深入理解 KVC KVO 實現機制 KVO

kvc和kvo都屬於鍵值程式設計而且底層實現機制都是isa swizzing,所以本來想放在一起講的。但是篇幅有限所以就分成了兩篇博文。kvc實現機制傳送門 kvo概述 鍵值觀察key value observer就是觀察者模式。當需要檢測其他類的屬性值變化,但又不想被觀察的類知道,有點像fbi監視...