關於KVC的一些思考

今天看了一篇介紹KVC底層原理的文章,整體寫的不錯,同時也引起了我的一些思考,語法糖取值和賦值的原理是不是和KVC一樣或相似呢?

在日常開發中我們會通過KVC給屬性或者實例變量進行賦值/取值,由於我們平時使用屬性較多,下面我將使用屬性舉例去講解KVC的一些原理。

一、語法糖方式取值和 KVCvalueforKey:
  1. 語法糖方式取值會調用屬性的getter方法:由下圖可以看出,並沒去調用在KVC機制中優先級更高的getAge方法

但如果你沒讓系統幫你自動合成setter方法(使用@dynamic修飾屬性),也沒有自己重寫(聲明以及實現 key這個getter方法),取值的時候會crash; 如果你重寫了key這個getter方法,則可以正常取值,但是並不會並不會去查找getKey這個在KVC機制中優先級更高的方法,也不會去找_key等實例變量

  1. KVCvalueforKey:的底層原理
二、語法糖方式賦值和KVCsetValue:forKey:

1.語法糖方式賦值
正常情況下直接去調用setKey:這個方法,因爲就算假設和KVC中的查找方法機制一致,setKey:優先級也是最高的,所以一定回調用setKey:這個方法;
如果沒讓系統幫你自動合成,也沒有自己聲明以及實現,賦值的時候會crash,並不會接着查找_setKey:setIsKey:方法,也不會去找_key等實例變量,

2.KVCsetValue:forKey: 底層原理
因爲接下來要使用KVC給屬性賦值,所以需要先把屬性自動合成的settergetter方法給屏蔽掉;
使用@dynamic修飾屬性:不需要系統自動合成setter方法、getter方法、實例變量

總結

1.語法糖方式取值/賦值只關注你的keysetKey:這兩個方法是否聲明和實現,和KVC的底層原理不同;
2.如果你通過給實例變量取值/賦值來查看KVC的底層原理的話,就不用這麼麻煩了,你也可以看到關於成員變量的查找順序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章