最基本的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...