Key-Value Observing (KVO)
KVO:當指定的對象的屬性被修改了,允許對象接收到通知的機制。
[persion addObserver : self forKeyPath : @"age" options : NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context : nil ];
只要當前類中 age 這個屬性發(fā)生的變化都會觸發(fā)到以下的方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
同時不要忘記在 dealloc中移除監(jiān)聽
-( void )dealloc{
[ self . persion removeObserver : self forKeyPath : @"age" ];
}
下面就來看看它的實現(xiàn)原理

QQ20160723-0.png

QQ20160723-1.png
通過上面圖片可以看出 當某個類第一次被監(jiān)聽時,系統(tǒng)會在運行時期動態(tài)地創(chuàng)建一個繼承XqPersion的NSKVONOtifying_XqPersion類
在這個派生類中,重寫基類中任何被觀察屬性的setter方法,在setter方法中實現(xiàn)真正的通知機制.
在該類中重寫了監(jiān)聽屬性的set方法,來通知監(jiān)聽器
- (void)setAge:(int)age
{
[super setAge:age];
[堅聽器 observeValueForKeyPath:@"age" ofObject:self change:@{} context:nil];
}