文章目錄
一、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的**,在前面的例子新增方法willchangevalueforkey
和didchangevalueforkey
可得到驗證。
若乙個類有例項變數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.首...