定義 KVC的全稱是Key-Value Coding,俗稱“鍵值編碼”,可以通過一個key來訪問某個屬性 常見的API有: setValue:forKey:的原理 解析:當我們執行 setValue 的時候,要會去判斷這個對象有沒有 setKey 和 _setKey 這兩個方法,按順序判斷,如果有就 ...
定義
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 的成員變數,找到就賦值,沒找到就拋異常.
- accessInstanceVariablesDirectly :是否允許訪問成員變數,預設YES
這個方法有個應用場所就是如果你自己寫框架,你的一些私有的變數不想被外部通過KVC的方式去修改,就可以重寫這個方法,返回 NO 即可!
valueForKey:的原理
取值和賦值差不多,就是判斷的獲取方法多了兩個而已。就是 getKey、isKey
通過KVC修改屬性值或者成員變數值會觸發KVO嗎?
答案是肯定可以的。因為無論你對象有沒有set方法,KVC底層都會調用 willChangeValueForKey 和 didChangeValueForKey,上一篇我們說過只要手動調用這兩個方法,KVC就會被調用。