今天看了一篇介紹
KVC底層原理的文章,整體寫的不錯(cuò),同時(shí)也引起了我的一些思考,語(yǔ)法糖取值和賦值的原理是不是和KVC一樣或相似呢?
在日常開(kāi)發(fā)中我們會(huì)通過(guò)KVC給屬性或者實(shí)例變量進(jìn)行賦值/取值,由于我們平時(shí)使用屬性較多,下面我將使用屬性舉例去講解KVC的一些原理。

分別使用語(yǔ)法糖和KVC方式給屬性賦值
一、語(yǔ)法糖方式取值和 KVC的valueforKey:
- 語(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)key的getter方法,則取值的時(shí)候會(huì)發(fā)生crash; 如果你重寫了key的getter方法,則可以正常取值,但是并不會(huì)并不會(huì)去查找getKey這個(gè)在KVC機(jī)制中優(yōu)先級(jí)更高的方法,也不會(huì)去找_key等實(shí)例變量

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

valueforKey:
補(bǔ)充:accessInstanceVariablesDirectly的默認(rèn)值為YES
二、語(yǔ)法糖方式賦值和KVC的setValue:forKey:
- 語(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
-
KVC的setValue:forKey:底層原理
setValue:forKey:
總結(jié)
- 語(yǔ)法糖方式取值/賦值只關(guān)注你的
key和setKey:這兩個(gè)方法是否聲明和實(shí)現(xiàn),和KVC的底層原理不同 - 如果你通過(guò)給實(shí)例變量取值/賦值來(lái)查看
KVC的底層原理的話,就不用這么麻煩了,也可以看到關(guān)于成員變量的查找順序
