ngnmg
KVC底層實(shí)現(xiàn)
- 當(dāng)一個(gè)對(duì)象調(diào)用setValue方法麸粮,方法內(nèi)部會(huì)做以下操作:
- 檢查是否存在相應(yīng)key的set方法绘证,如果有就調(diào)用
- 如果沒有就查看有沒有與key同名并且?guī)聞澗€的屬性撵割,如果有就直接賦值。
- 如果沒有跑杭,就繼續(xù)查看有沒有與key同名不帶下劃線的屬性铆帽,如果有就直接賦值
- 如果還是沒有找到,就調(diào)用setValue:forUndefinedKey:方法
KVO底層實(shí)現(xiàn)
kvo基于runtime機(jī)制實(shí)現(xiàn)德谅,使用了isa混寫爹橱,當(dāng)一個(gè)對(duì)象(假設(shè)是person對(duì)象,person對(duì)象的類是MYPerson類)的屬性值發(fā)生變化時(shí)窄做,系統(tǒng)會(huì)自動(dòng)產(chǎn)生一個(gè)類繼承自MYPerson:NSKVONotifying_MYPerosn愧驱,在這個(gè)類的setAge方法里面,調(diào)用[super setAge:age] [self willChangeValueForKey:@"age"] 和[self
didChangeValueForKey:@"age"]椭盏,這兩個(gè)方法會(huì)調(diào)用 automaticallyNotifiesObserversForKey同時(shí)派生類還重寫了 class 方法以“欺騙”外部調(diào)用者它就是起初的那個(gè)類组砚。然后系統(tǒng)將這個(gè)對(duì)象的 isa 指針指向這個(gè)新誕生的派生類,因此這個(gè)對(duì)象就成為該派生類的對(duì)象了掏颊,因而在該對(duì)象上對(duì) setter 的調(diào)用就會(huì)調(diào)用重寫的 setter糟红,從而激活鍵值通知機(jī)制。此外乌叶,派生類還重寫了 dealloc 方法來釋放資源盆偿。
KVO的優(yōu)缺點(diǎn)
-
優(yōu)點(diǎn)
- 能夠提供一種簡便的方法來實(shí)現(xiàn)兩個(gè)對(duì)象之間的同步
- 能夠?qū)Ψ俏覀儎?chuàng)建的對(duì)象,即內(nèi)部對(duì)象的狀態(tài)改變做出響應(yīng)准浴,而且不需要改變內(nèi)部對(duì)象的實(shí)現(xiàn)
- 能夠提供觀察的屬性的新值以及先前值
-
缺點(diǎn)
- 我們觀察的屬性必須使用string來定義陈肛,因此在編譯器不會(huì)出現(xiàn)警告以及檢查
- 對(duì)屬性進(jìn)行重構(gòu)將會(huì)導(dǎo)致我們的觀察代碼不可再用
- 當(dāng)釋放觀察者需要移除觀察者