KVC KVO原理及應用 上

2021-07-13 06:31:07 字數 2733 閱讀 7268

本文參考部落格未盡之處可到原部落格中查詢

一、kvc的原理

kvc運用了乙個isa-swizzling技術,並且通過isa-swizzling來實現其內部查詢定位的。簡單講 ,在編譯時kvc會被進行如下編譯:

//編譯前

[obj setvalue:@"objname"

forkey:@"name"]

//編譯後

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

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

method(obj, sel, @"objname", @"name");

上面的三個方法可以理解為

1. 用sel_get_uid方法,通過字串獲得方法的指標

2. 用objc_msg_lookup方法,用isa指標到物件所屬的類中,通過方法指標找到方法

3. 呼叫方法賦值

二、kvc的應用

1. 重寫setvalue:forkey

在字典轉模型中,如果字典中的key有id這個關鍵字,直接轉模型時會報警告,為了解決這個警告,我們可以重寫setvalue:forkey:

- (void)setvalue:(id)value forkey:(nsstring *)key

else

}

2. 基本的賦值取值
[book setvalue:@"《賈伯斯傳》"

forkey:@"name"];

nsstring *name=[book valueforkey:@"name"];

3. 使用路徑

可以通過點語法取值

@inte***ce

author : nsobject

@end

#import "author.h"

@implementation

author

@end

@class

author;

@inte***ce

book : nsobject

@end

book *book=[[[book alloc] init] autorelease];

[book setvalue:@"《賈伯斯傳》" forkey:@"name"];

nsstring *name=[book valueforkey:@"name"];

author *author=[[[author alloc] init] autorelease];

[author setvalue:@"walter isaacson" forkey:@"name"];

[book setvalue:author forkey:@"author"];

nsstring *authorname=[book valueforkeypath:@"author.name"];

4. 自動裝箱拆箱

即可以用基本資料型別接收傳入的字串型別,也可以用字串型別直接列印取出來的基本資料型別。

5. 對陣列的操作

book *book =[[[book alloc] init] autorelease]; 

book *book1=[[[book alloc] init] autorelease];

[book1 setvalue:@"5.0"

forkey:@"price"];

book *book2=[[[book alloc] init] autorelease];

[book2 setvalue:@"4.0"

forkey:@"price"];

nsarray *books=[nsarray arraywithobjects:book1,book2,nil];

[book setvalue:books forkey:@"relativebooks"];

nslog(@"relative books price: %@",[book valueforkeypath:@"relativebooks.price"]);

6. 為例項的多個屬性賦值
book *book4=[[book alloc] init]; 

nsarray *bookproperties=[nsarray arraywithobjects:@"name",@"price",nil];

nsdictionary *bookpropertiesdictionary=[book4 dictionarywithvaluesforkeys:bookproperties];

nslog(@"book values: %@",bookpropertiesdictionary);

nsdictionary *newbookpropertiesdictionary=[nsdictionary dictionarywithobjectsandkeys:@"《objective c入門》",@"name", @"20.5",@"price",nil];

[book4 setvaluesforkeyswithdictionary:newbookpropertiesdictionary];

nslog(@"book with new values: %@",[book4 dictionarywithvaluesforkeys:bookproperties]);

KVC KVO原理及應用 下

本文摘錄自部落格 寫得非常不錯,想要深入研究,可研讀原部落格 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...