什么是KVO贰谣?
KVO是觀察者模式娜搂,當(dāng)一個被觀察者對象屬性發(fā)生改變時迁霎,觀察者會收到通知。
有利于兩個類之間的解耦百宇。
KVO的實現(xiàn)原理
KVO基于運(yùn)行時原理考廉。
當(dāng)監(jiān)聽對象的屬性時,會為被監(jiān)聽對象的類創(chuàng)建一個派生類NSKVONotifying_Class并且重寫屬性的setter方法携御,會在setter方法之前和之后通知被監(jiān)聽對象的屬性值更改情況昌粤。在這個過程中指向原來對象的isa指針會指向新創(chuàng)建的子類。
每個對象都有isa指針啄刹,它指向該對象所屬的類涮坐。
setter內(nèi)的實現(xiàn)
willChangeValueForKey:在屬性改變之前調(diào)用;
didChangeValueForKey:在屬性改變之后調(diào)用誓军;
observeValueForKey:ofObject:change:context: 最后也會被調(diào)用
KVO觸發(fā)條件
是否執(zhí)行了setter方法袱讹,是否使用了kvc賦值。
KVO使用
1谭企、注冊監(jiān)聽者,實施監(jiān)聽
params:
object:被監(jiān)聽對象
observe:監(jiān)聽對象
keyPath:被監(jiān)聽屬性
options:
...new:監(jiān)聽方法中獲取新值评肆。
...old: 監(jiān)聽方法中獲取舊值债查。
...initail:監(jiān)聽方法中獲取初始化值
...prior:屬性改變前后的值都會傳到監(jiān)聽方法
2、實現(xiàn)監(jiān)聽方法