iOS KVC實現原理

2021-08-19 17:32:10 字數 3374 閱讀 6889

文章目錄

一、kvc在ios中的定義

二、常用的方法說明

三、賦值實現原理

四、取值實現原理

五、kvc 為什麼能能夠觸發 kvo

一、kvc在ios中的定義

kvc的全稱為keyvaluecoding,簡稱鍵值編碼。是對nsobjcet的擴充套件,分類名為 : nskeyvaluecoding

我們經常用kvc或者setter方法來觸發kvo,實現鍵值變化監聽,實現一些功能。

二、常用的方法說明

// 1、將鍵字串key所對應的屬性的值設定為value。不能設定屬性值時,將會引起接收器呼叫方法2

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

// 2、當屬性值設定失敗,呼叫此方法

- (void)setvalue:(nullable id)value forundefinedkey:(nsstring *)key

// 3、返回標識屬性的鍵字串所對應的值。如果獲取失敗,將會引起接收器呼叫方法4

- (nullable id)valueforkey:(nsstring *)key

// 4、取值失敗,呼叫此方法

- (nullable id)valueforundefinedkey:(nsstring *)key

// 5、在鍵字串key所對應的"標量"型屬性值設為nil,呼叫此方法,並丟擲nsinvalidargumentexception異常(可demo測試)

- (void)setnilvalueforkey:(nsstring *)key

// 6、預設返回值yes,代表如果沒有找到set方法的話,會按照_key,_iskey,key,iskey的順序搜尋成員,設定成no就不這樣搜尋

+ (bool)accessinstancevariablesdirectly

標量 : 屬性中的單純的數值(整數、實數、布林值等)在賦值的時候如果是結構體,必須包裝成nsvalue例項如果是標量型屬性,必須包裝成nsnumber例項三、賦值實現原理

原理總綱

1、查詢是否實現setter、_setter 方法,如果有,優先呼叫setter方法完成賦值(注意:set後面的鍵的第一字字母必須是大寫!!)

2、當沒找到setter方法,呼叫accessinstancevariablesdirectly詢問。

如果返回yes,順序匹配變數名與 _,_is,,is,匹配到則設定其值

如果返回no,結束查詢。並呼叫 setvalue:forundefinedkey:報異常

3、如果既沒有setter也沒有例項變數時,呼叫 setvalue:forundefinedkey:

結合demo,寫下基本實現原理

// .h檔案

#import @inte***ce peson : nsobject

@end

// .m檔案

#import "peson.h"

#import @implementation peson

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

else

// 2、詢問 accessinstancevariablesdirectly,預設yes,繼續往下查詢

}elseelse}}

}//記得釋放

free(ivar);

//如果沒找到,呼叫setvalue: forundefinedkey: 丟擲異常

if (!flag)

}}+(bool)accessinstancevariablesdirectly

注意: 上面有乙個細節需要說下,對於標量型屬性賦值,如果是純數值,需要使用包裝類nsnumber,對於結構體,需要用nsvalue例項包裝。通過上面我們也可以發現,為什麼kvc和setter方法都可以觸發kvo 。四、取值實現原理取值的原理跟賦值原理差不多,也寫下吧

原理總綱

1、查詢是否實現getter方法,依次匹配`-get` 和 `-` 和 `is`,如果找到,直接返回。

需要注意的是 :

如果返回的是物件指標型別,則返回結果。

如果返回的是nsnumber轉換所支援的標量型別之一,則返回乙個nsnumber

否則,將返回乙個nsvalue

2、當沒有找到getter方法,呼叫accessinstancevariablesdirectly詢問

如果返回yes, _,_is,,is,找到了返回對應的值

如果返回no,結束查詢。並呼叫 valueforundefinedkey: 報異常

3、如果沒找到getter方法和屬性值,呼叫 valueforundefinedkey: 報異常

// 高階著實現上面demo的取值方法

- (id)valueforkey:(nsstring *)key

else if ([self respondstoselector:nsselectorfromstring(key)])

else if ([self respondstoselector:nsselectorfromstring(iskey)])

elseelse}}

}free(ivar);

//如果沒找到,呼叫

if (!flag)

}return nil;

}

五、kvc 為什麼能能夠觸發 kvokvc 只所以能夠觸發 kvo,那是因為 在 kvc 底層有手動觸發 kvo的**,在前面的例子新增方法willchangevalueforkeydidchangevalueforkey可得到驗證。

若乙個類有例項變數nsstring *_foo,呼叫setvalue: forkey:時,可以以foo還是_foo作為key?

看完這篇部落格應該知道怎麼回答了吧。

IOS KVC 知識梳理

key value code 鍵值編碼 是乙個基於nskeyvaluecoding非正式協議實現的機制,它可以直接通過key值對物件的屬性進行訪問操作,不需要通過呼叫明確的訪問方法,這樣就是在執行時動態在訪問和修改物件的的屬性,如果愛實現了訪問器方法的類中點語法和kvc訪問物件差別不大,反之,怎kv...

IOS KVC 鍵值編碼 模式

在ios的中,沒有絕對的私有,包括方法和變數。私有方法通過類例項無法直接訪問,但因為有 編譯時執行 機制,我們可以通過類似perfromselectoe的方法來訪問私有方法。而ios中的私有變數通過所謂的kvc模式也是可以訪問的。下面特酷吧整理了ios kvc模式的使用方法。kvc模式就是key v...

ios KVC的概述與使用

kvc,即 key value coding,它是一種使用字串識別符號,間接訪問物件屬性的機制,它是很多技術的基礎。主要的方法就兩個,setvalue forkey,valueforkey 在programming guide中說,使用kvc可以簡化 但事實上使用起來,還是要看具體情況。例項 1.首...