【OC底層】KVC原理

 定義

KVC的全稱是Key-Value Coding,俗稱「鍵值編碼」,能夠經過一個key來訪問某個屬性框架

 

常見的API有:編碼

- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;

 

setValue:forKey:的原理

 

解析:當咱們執行 setValue 的時候,要會去判斷這個對象有沒有 setKey 和 _setKey 這兩個方法,按順序判斷,若是有就調用,若是沒有就會調用對象的accessInstanceVariablesDirectly方法去判斷能不能去訪問成員變量,若是不能就直接拋異常,能的話,再去按順序訪問 _key、_isKey、key、isKey 的成員變量,找到就賦值,沒找到就拋異常.spa

 

accessInstanceVariablesDirectly :是否容許訪問成員變量,默認YEScode

 這個方法有個應用場所就是若是你本身寫框架,你的一些私有的變量不想被外部經過KVC的方式去修改,就能夠重寫這個方法,返回 NO 便可!對象

valueForKey:的原理

 

取值和賦值差很少,就是判斷的獲取方法多了兩個而已。就是 getKey、isKey blog

 

經過KVC修改屬性值或者成員變量值會觸發KVO嗎? 

 答案是確定能夠的。由於不管你對象有沒有set方法,KVC底層都會調用 willChangeValueForKey 和 didChangeValueForKey上一篇咱們說過只要手動調用這兩個方法,KVO就會被調用。get

 若是有set方法,也會調用該set方法。class

 KVC技術是會破壞面向對象思想的!變量

相關文章
相關標籤/搜索