iOS開(kāi)發(fā)實(shí)戰(zhàn) - 關(guān)于KVC的一些思考

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

在日常開(kāi)發(fā)中我們會(huì)通過(guò)KVC給屬性或者實(shí)例變量進(jìn)行賦值/取值,由于我們平時(shí)使用屬性較多,下面我將使用屬性舉例去講解KVC的一些原理。

分別使用語(yǔ)法糖和KVC方式給屬性賦值
一、語(yǔ)法糖方式取值和 KVCvalueforKey:
  1. 語(yǔ)法糖方式取值會(huì)調(diào)用屬性的getter方法:由下圖可以看出,并沒(méi)去調(diào)用在KVC機(jī)制中優(yōu)先級(jí)更高的getAge方法
語(yǔ)法糖方式調(diào)用getter方法

如果你使用了@dynamic去修飾屬性(不讓系統(tǒng)幫助去自動(dòng)生成對(duì)應(yīng)屬性的setter方法和getter方法),且也沒(méi)有自己實(shí)現(xiàn)keygetter方法,則取值的時(shí)候會(huì)發(fā)生crash; 如果你重寫了keygetter方法,則可以正常取值,但是并不會(huì)并不會(huì)去查找getKey這個(gè)在KVC機(jī)制中優(yōu)先級(jí)更高的方法,也不會(huì)去找_key等實(shí)例變量

key方法缺失導(dǎo)致的crash
  1. KVCvalueforKey:的底層原理
valueforKey:

補(bǔ)充:accessInstanceVariablesDirectly的默認(rèn)值為YES

二、語(yǔ)法糖方式賦值和KVCsetValue:forKey:
  1. 語(yǔ)法糖方式賦值
    直接去調(diào)用setKey:這個(gè)方法,即便語(yǔ)法糖中和KVC中的查找方法機(jī)制一致,setKey:優(yōu)先級(jí)也是最高的,所以一定會(huì)調(diào)用setKey:這個(gè)方法;
    如果該方法沒(méi)讓系統(tǒng)幫你自動(dòng)生成,賦值的時(shí)候會(huì)crash,并不會(huì)像KVC機(jī)制那樣接著查找_setKey:setIsKey:方法,更不會(huì)去找_key等實(shí)例變量
setKey:方法缺失導(dǎo)致的crash
  1. KVCsetValue:forKey: 底層原理
    setValue:forKey:
總結(jié)
  1. 語(yǔ)法糖方式取值/賦值只關(guān)注你的keysetKey:這兩個(gè)方法是否聲明和實(shí)現(xiàn),和KVC的底層原理不同
  2. 如果你通過(guò)給實(shí)例變量取值/賦值來(lái)查看KVC的底層原理的話,就不用這么麻煩了,也可以看到關(guān)于成員變量的查找順序
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容