今天看了一篇介紹
KVC
底層原理的文章,整體寫的不錯,同時也引起了我的一些思考,語法糖取值和賦值的原理是不是和KVC
一樣或相似呢?
在日常開發中我們會通過KVC
給屬性或者實例變量進行賦值/取值,由於我們平時使用屬性較多,下面我將使用屬性舉例去講解KVC
的一些原理。
一、語法糖方式取值和 KVC
的valueforKey:
- 語法糖方式取值會調用屬性的
getter
方法:由下圖可以看出,並沒去調用在KVC
機制中優先級更高的getAge
方法
但如果你沒讓系統幫你自動合成setter
方法(使用@dynamic
修飾屬性),也沒有自己重寫(聲明以及實現 key
這個getter
方法),取值的時候會crash
; 如果你重寫了key
這個getter
方法,則可以正常取值,但是並不會並不會去查找getKey
這個在KVC機制中優先級更高的方法,也不會去找_key
等實例變量
-
KVC
的valueforKey:
的底層原理
二、語法糖方式賦值和KVC
的setValue:forKey:
1.語法糖方式賦值
正常情況下直接去調用setKey:
這個方法,因爲就算假設和KVC中的查找方法機制一致,setKey:
優先級也是最高的,所以一定回調用setKey:
這個方法;
如果沒讓系統幫你自動合成,也沒有自己聲明以及實現,賦值的時候會crash
,並不會接着查找_setKey:
和setIsKey:
方法,也不會去找_key
等實例變量,
2.KVC
的setValue:forKey:
底層原理
因爲接下來要使用KVC
給屬性賦值,所以需要先把屬性自動合成的setter
和getter
方法給屏蔽掉;
使用@dynamic
修飾屬性:不需要系統自動合成setter
方法、getter
方法、實例變量
總結
1.語法糖方式取值/賦值只關注你的key
和setKey:
這兩個方法是否聲明和實現,和KVC
的底層原理不同;
2.如果你通過給實例變量取值/賦值來查看KVC
的底層原理的話,就不用這麼麻煩了,你也可以看到關於成員變量的查找順序。