KVO 的底層實現(xiàn)原理
(1)KVO 是基于 runtime 機制實現(xiàn)的
(2)假如有個對象DoLin(類型為Dog), 其屬性name發(fā)生變化時,系統(tǒng)會自動生成一個繼承Dog的類,NSKVONotifying_類名,次例為NSKVONotifying_Dog, 在這個類的setName方法中調用3個方法:
?[super setName:name];?
[self willChangeValueForKey:@"name"];?
[self didChangeValueForKey:@"name"];?
后面兩個方法內部會主動調用;
(3)方法回調
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary?*)change context:(void*)context;
根據(jù)此方法的返回做UI刷新等操作。
?KVO的作用:
- (void)viewDidLoad {
? ? [super viewDidLoad];
? ? Dog*d1 = [[Dogalloc]init];
? ? d1.name? =@"DoLin";
[d1 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"123"];//@"123"是隨意寫入的,如果很多不同的模型需要用到KVO, 可寫入不同值用于區(qū)分,否則,寫nil即可。
}
/**
*? 利用KVO 監(jiān)聽到對象屬性值改變后,就會調用這個方法
*
*? @param keyPath 哪一個屬性被改了
*? @param object? 哪一個對象的屬性被改了
*? @param change? 改成什么樣了
*/- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{
// NSKeyValueChangeNewKey == @"new"
NSString*new = change[NSKeyValueChangeNewKey];
// NSKeyValueChangeOldKey == @"old"
NSString*old = change[NSKeyValueChangeOldKey];NSLog(@"%@-%@",new,old);}