KVC 鍵值編碼與KVO鍵值監聽的應用(一)

2021-08-27 22:06:55 字數 2213 閱讀 9810

1、鍵值編碼的基本概念和用法

鍵值編碼的基本概念:

kvc是keyvalue coding的簡稱,它是一種可以直接通過字串的名字(key)來訪問類屬性的機制。使用該機制不需要呼叫訪問方法和變數例項就可以訪問物件屬性。本質上講,鍵-值編碼定義了你的程式訪問方法需要實現的樣式及方法簽名。

在應用程式中實現鍵-值編碼相容性是一項重要的設計原則。訪問方法可以加強合適的資料封裝,而鍵值編碼方法在多數情況下可簡化程式**。

鍵-值 編碼方法在objective-c非標準協議 nskeyvaluecoding中被宣告,預設的實現方法由nsobject提供。

鍵-值 編碼支援帶有物件值的屬性,同時也支援純數值型別和結構。非物件引數和返回值型別會被識別並自動封裝/解封。

(kvc能訪問類的私有變數型別)

2、其實由於objc的語言特性,你根部不必進行任何操作就可以進行屬性的動態讀寫,這種方式就是key value coding(簡稱kvc)。

kvc的操作方法由nskeyvaluecoding協議提供,而nsobject就實現了這個協議,也就是說objc中幾乎所有的物件都支援kvc操作,常用的kvc操作方法如下:

• 動態設定: setvalue:屬性值 forkey:屬性名(用於簡單路徑)、setvalue:屬性值 forkeypath:屬性路徑(用於復合路徑,例如person有乙個account型別的屬性,那麼person.account就是乙個復合屬性)

• 動態讀取: valueforkey:屬性名 、valueforkeypath:屬性名(用於復合路徑)

3、通過kvc為物件的屬性變數設定值:

[物件 setvalue:屬性值 forkey:屬性名];

此方法是非常智慧型的

(1)假如物件所對應的類中有與屬性名相同的變數,就會直接對該變數賦值。

(2)若對應的類中沒有與屬性名相同的變數,此方法就會尋找前面帶下劃線屬性名的變數,若有」_屬性名」的變數就會對其賦值。若仍然沒有的話就會報錯。

(3)需要注意的是:若該設定方法的屬性名帶有下劃線,則會直接在類中尋找相同屬性名的變數對其賦值。但是若找不到的話,不會再去尋找去掉下劃線後的屬性變數。

(a. 此方法是nskeyvaluecoding協議中的方法,因為nsobject遵守了該協議,所以所有繼承自根類nsobject的類的物件都可以直接呼叫此方法。

b. 此方法非常暴力:不管物件對應的類中相應變數是不是私有的都能一概訪問對其賦值設定類物件的變數值

c. 通過kvc設值物件,此物件(被設定賦值即物件名作為鍵的物件)會被retain ,物件的引用計時器會自增。

d. 若物件對應類中為某變數提供了set方法,則使用此kvc方法對物件中的該變數賦值時會優先呼叫類中此變數的set方法進行賦值,若此變數沒有set方法,則kvc方法直接對其變數賦值。get方法也與此類似。

)4、通過kvc獲取物件屬性值

[物件 valueforkey: 屬性名];

新建oc工程具體**如下:

新建乙個空的dog類

再建乙個person測試類 如下:

//

// person.h

// kvc的基本用法

////

#import @class dog;

@inte***ce person : nsobject

-(void)setdog:(dog *)dg;

@end

//// person.m

// kvc的基本用法

////

#import "person.h"

@implementation person

-(nsstring *)description

-(void)setdog:(dog *)dg

nslog(@"setdog"); // 發現會呼叫dog的set方法

}@end

//

// main.m

// kvc的基本用法

////

#import #import "person.h"

#import "dog.h"

int main(int argc, const char * argv)

return 0;

}

執行結果如下:

物件導向 鍵值編碼 KVC 與鍵值監聽 KVO

最基本的kvc由nskeyvaluecoding協議提供支援,最基本的操作屬性的兩個方法如下 setvalue 屬性值forkey 屬性名 為指定屬性設定值。valueforkey 屬性名 獲取指定屬性值 在kvc程式設計方式中,無論呼叫setvalue forkey 方法,還是呼叫valuefor...

KVO與KVC鍵值監聽的機制

kvc 通過key 來檢測value的值 直接貼上 var peo stu peo.name cao kvc 通過key來訪問value var name peo.valueforkey name as nsstring peo.setvalue kai forkey name print peo....

鍵值編碼KVC

許多程式設計技術都基於間接機制,包括整個物件導向程式設計領域。本章將介紹另一種間接機制,這種機制不屬於obj c語言的特性,而是cocoa提供的一種特性。我們知道在c 中可以通過反射讀寫乙個物件的屬性,有時候這種方式特別方便,因為你可以利用字串的方式去動態控制乙個物件。其實由於objc的語言特性,你...