Key-Value Observing (KVO)
KVO:當(dāng)指定的對象的屬性被修改了,允許對象接收到通知的機(jī)制色解。
[persion addObserver : self forKeyPath : @"age" options : NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context : nil ];
只要當(dāng)前類中 age 這個(gè)屬性發(fā)生的變化都會(huì)觸發(fā)到以下的方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
同時(shí)不要忘記在 dealloc中移除監(jiān)聽
-( void )dealloc{
[ self . persion removeObserver : self forKeyPath : @"age" ];
}
下面就來看看它的實(shí)現(xiàn)原理
通過上面圖片可以看出 當(dāng)某個(gè)類第一次被監(jiān)聽時(shí),系統(tǒng)會(huì)在運(yùn)行時(shí)期動(dòng)態(tài)地創(chuàng)建一個(gè)繼承XqPersion的NSKVONOtifying_XqPersion類
在這個(gè)派生類中,重寫基類中任何被觀察屬性的setter方法,在setter方法中實(shí)現(xiàn)真正的通知機(jī)制.
在該類中重寫了監(jiān)聽屬性的set方法,來通知監(jiān)聽器
- (void)setAge:(int)age
{
[super setAge:age];
[堅(jiān)聽器 observeValueForKeyPath:@"age" ofObject:self change:@{} context:nil];
}