-
KVO的全稱是Key-Value Observing王污,俗稱“鍵值監(jiān)聽”罢吃,可以用于監(jiān)聽某個對象屬性值的改變楚午。
KVO.png -
未使用KVO監(jiān)聽的對象,instance對象的isa指針會指向class對象尿招,class對象中包括對象方法setAge:和 age矾柜。
未使用KVO監(jiān)聽的對象.png - 使用了KVO監(jiān)聽的對象
1、instance對象的isa指針會指向一個由Runtime動態(tài)創(chuàng)建的繼承自class對象的子類(NSKVONotifying_cls
)就谜,NSKVONotifying_cls類對象會重寫父類class對象的set方法怪蔑、class方法、dealloc方法丧荐、_isKVOA方法的實(shí)現(xiàn)
2缆瓣、當(dāng)修改instance對象的屬性時,set方法內(nèi)部會調(diào)用Foundation的_NSSet**ValueAndNotify
函數(shù)虹统,函數(shù)內(nèi)部會調(diào)用willChangeValueForKey:
弓坞、父類原來的setter實(shí)現(xiàn)
、didChangeValueForKey:
3车荔、didChangeValueForKey:內(nèi)部會調(diào)用observer的observeValueForKeyPath:ofObject:change:context:
方法
使用了KVO監(jiān)聽的對象.png
_NSSet*ValueAndNotify的內(nèi)部實(shí)現(xiàn).png
- 手動調(diào)用willChangeValueForKey和didChangeValueForKey可以手動觸發(fā)KVO渡冻。
- 直接修改成員變量
不會
觸發(fā)KVO