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 }

 

posted on 2015-03-25 17:29  FKunLam  阅读(126)  评论(0编辑  收藏  举报