KVC簡介
KVC(Key-value coding)鍵值編碼
指iOS的開發(fā)中,可以允許開發(fā)者通過Key名直接訪問對象的屬性,或者給對象的屬性賦值。而不需要調(diào)用明確的存取方法。這樣就可以在運(yùn)行時(shí)動(dòng)態(tài)地訪問和修改對象的屬性。
常用方法:
- (nullable id)valueForKey:(NSString *)key; //直接通過Key來取值
- (void)setValue:(nullable id)value forKey:(NSString *)key; //通過Key來設(shè)值
- (nullable id)valueForKeyPath:(NSString *)keyPath; //通過KeyPath來取值
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath; //通過KeyPath來設(shè)值
作者:黑暗中的孤影
鏈接:http://www.lxweimin.com/p/45cbd324ea65
valueForKey:的原理
查找key獲取value值的流程圖
1-順序查找getKey/key/isKey/_key這4個(gè)方法,找到就調(diào)用返回value值
2-沒找到,就調(diào)用accessInstanceVariablesDirectly,是否允許直接訪問對象變量
3-假如accessInstanceVariablesDirectly為Yes,就順序查找成員變量_key,_isKey,key,isKey,找到就返回value值,否則就調(diào)用valueForUndefinedKey:并拋出異常.
4-假如accessInstanceVariablesDirectly為NO,調(diào)用valueForUndefinedKey:并拋出異常.
valueForKey:原理圖
setValue:forKey:的原理
根據(jù)key設(shè)置value值的流程圖
1-順序查找setKey:,_setKey:這2個(gè)方法,找到就調(diào)用設(shè)置value值
2-沒找到,就調(diào)用accessInstanceVariablesDirectly,是否允許直接訪問對象變量
3-假如accessInstanceVariablesDirectly為Yes,就順序查找成員變量_key,_isKey,key,isKey,找到就直接賦值value值,否則就調(diào)用setValue:forUndefinedKey:并拋出異常.
4-假如accessInstanceVariablesDirectly為NO,調(diào)用setValue:forUndefinedKey:并拋出異常.
屏幕快照 2018-08-07 11.29.25.png
KVO
key value observing (鍵值監(jiān)聽 /觀察者模式)/是一種回調(diào)機(jī)制
在某個(gè)對象注冊監(jiān)聽者后/在被監(jiān)聽的對象發(fā)生改變時(shí)/對象會(huì)發(fā)送一個(gè)通知給監(jiān)聽者/以便監(jiān)聽者執(zhí)行回調(diào)
就是每次指定的被觀察的對象的屬性被修改后 /KVO就會(huì)自動(dòng)通知響應(yīng)的觀察者
KVO和KVC一樣都依賴于Runtime的動(dòng)態(tài)及時(shí) /都屬于鍵值編程而且底層實(shí)現(xiàn)機(jī)制都是isa-swizzling
系統(tǒng)利用Runtime主動(dòng)生成一個(gè)子類對象,NSKVONotifying_xxx類,改寫屬性set方法大概如下所示:
willChangeValueForKey:即將改變值
super setXXX:父類設(shè)置值
didChangeValueForKey:同時(shí)通知監(jiān)聽器對象屬性改變了
屏幕快照 2018-08-07 12.12.17.png
屏幕快照 2018-08-07 12.08.15.png