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

2021-07-09 10:50:17 字數 2460 閱讀 2067

最基本的kvc由nskeyvaluecoding協議提供支援,最基本的操作屬性的兩個方法如下

-setvalue:屬性值forkey:屬性名 :為指定屬性設定值。

-valueforkey:屬性名:獲取指定屬性值

在kvc程式設計方式中,無論呼叫setvalue:forkey:方法,還是呼叫valueforkey:方法,都是通過nsstring物件來指定被操作屬性的,其中forkey標籤用於傳入屬性名。

對於」setvalue:屬性值 forkey@」name」;」**,底層的執行機制如下。

1. 程式優先考慮呼叫"setname:屬性值;"**通過setter方法完成設定。

2. 如果該類沒有setname:方法,那麼kvc機制會搜尋該類中名為_name的成員變數,無論該成員變數實在類介面部分定義,還是在

類實現部分定義,也無論用哪個訪問控制符修飾,這條kvc**底層實際就是_name成員變數賦值。

3. 如果該類既沒有setname:方法,也沒有定義_name成員變數,那麼kvc機制會搜尋該類中名為name的成員變數,無論該成員變數

是在類介面部分定義,還是在類實現部分定義,也無論用哪個訪問控制符修飾,這條kvc**底層實際上就是對name成員變數賦值。

4. 如果上面3步都沒有找到,那麼系統將會執行該物件的setvalue:forundefinedkey:方法(其實就是乙個異常)

對於」valueforkey@」name」;」**,底層的執行機制如下

2. 如果該類沒有name方法,那麼kvc機制會搜尋該類中名為_name的成員變數,無論該成員變數實在類介面部分定義還是在類實現部

分定義,也無論呼叫哪個訪問控制符修飾,這條kvc**底層實際上就是返回_name成員變數的值。

3. 如果該類既沒有name方法,也沒有定義_name成員變數,那麼kvc機制會搜尋該類中名為name的成員變數,無論該成員變數實在類

介面部分定義還是在類實現部分定義,也無論呼叫哪個訪問控制符修飾,這條kvc**底層實際上就是返回name成員變數的值。

4. 如果上面3步都沒有找到,那麼系統將會執行該物件的valueforundefinedkey:方法。(其實就是乙個異常)

objective-c並不存在絕對隱藏的方法,即使乙個方法僅僅在類實現部分定義,根本不放在類介面部分定義,程式也依然可通過nsobject提供的performselector:或performselector:withobject:方法呼叫到objective-c物件的方法。
在kvc協議中操作key路徑的方法如下

-setvalue:

forkeypath:

:根據key路徑設定屬性值。

-valueforkeypath:

:根據key路徑獲取屬性值。

實際上,通過kvc操作物件的效能比通過setter、getter方法操作的效能更差,使用kvc的優勢在於程式設計更加靈活,更適合提煉一些通用性質的**。由於kvc方式允許通過字串形式來操作物件的屬性,這個字串既可是常量,也可是變數,因此具有極高的靈活性。

kvo機制由nskeyvalueobserving協議提供支援,nsobject遵守了該協議,所以nsobject的子類(所有的objective-c類都是nsobject的子類)都可以使用該協議中的方法,該協議包含了如下常用方法用於註冊***

-

addobserver

:forkeypath

:options

:context::註冊乙個***用於監聽指定的key路徑。

-removeobserver

:forkeypath::為key路徑刪除指定的***。

-removeobserver

:forkeypath

:context::為key路徑刪除指定的***。

例:

在.h檔案中定義

@property (nonatomic ,weak ) fkitem * item;

- (void) showiteminfo;

在.m檔案中定義

- (void) showiteminfo

//自定義setitem:方法

- (void) setitem :(fkitem *)item

//重寫該方法,當被監聽的資料模型元件發生改變時,就會呼叫***的該方法

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

- (void) dealloc

鍵值編碼KVC

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

鍵值編碼 KVC 簡單的KVC

main.m kvc一 created by goddog on 15 1 3.1.我們可以通過setter和getter方法來設定和修改物件的屬性,同時也可以通過鍵值編碼 kvc 來操作物件屬性。2.何為kvc 以字串的形式間接的操作物件的屬性。設定值用 setvalue 屬性值 forkey 屬...

Objective C之KVC 鍵值編碼

ios中key value coding kvc 俗稱鍵值編碼,是乙個非正式的協議,它提供一種機制來間接訪問物件的屬性。直接訪問物件是通過呼叫訪問器的方法實現,而kvc不需要呼叫訪問器的設定和獲取方法,可以直接訪問物件的屬性。kvc的操作方法由nskeyvaluecoding協議提供,而nsobje...