KVO的内部实现原理
KVO的内部实现原理
1》KVO是基于runtime机制的。
2》当某个类的对象第一次被开始监听时,系统就会在运行期间动态为其创建以NSNotifying_类名 为名的子类,在这个子类中重写父类中任何被观察属性的setter方法,子类在被重写的setter方法中实现真正的通知机制。
1 // 刚创建person时,person的isa指针执行person 2 HMPerson *person = [[HMPerson alloc] init]; 3 4 person.name = @"HM"; 5 person.age = 10; 6 7 // 为person添加监听器 8 // 下面方法过后,person的isa指针指向了NSKVONotifying_HMPerson对象(默认生成person的子类) 9 [person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; 10 11 self.person = person; 12 13 // 子类NSKVONotifying_HMPerson会重写(void)setAge:(int)age方法,在方法中调用监听方法 14 // - (void)setAge:(int)age 15 // { 16 // [super setAge:age]; 17 // 18 // // [self observeValueForKeyPath:@"age" ofObject:<#(id)#> change:<#(NSDictionary *)#> context:<#(void *)#>] 19 // }
NSKVONotifying_HMPerson
1 // 被监听对象的监听属性改变时,就会调用这个方法 2 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 3 { 4 NSLog(@"%@", change); 5 }