2019IV

iOS-KVO实现原理

2018-12-22  本文已影响12人  见哥哥长高了

说到KVO(Key-Value-Observe),相信每个人都知道,具体用法肯定也是滚瓜烂熟。那么KVO的实现原理是怎样的呢?

我们就来举一个例子,来说明一个它的具体实现过程:
一、新建两个类:Person 和 Dog
二、给Dog添加一个属性age
三、初始化Person对象和Dog对象,给person对象添加对Dog对象age的观察
四、Person中实现方法
最后、改变age值,进行验证

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

其具体实现代码如下:

    self.person = [[Person alloc]init];
    
    self.dog = [[Dog alloc]init];
    
    [self.dog addObserver:self.person forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];

这个时候我们执行

self.dog.age = 19;

就会发现Person类中的以下方法调用

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    
    NSLog(@"检测到了%@发生了变化  %@----%@------%@",keyPath,object,change,context);
}

上面说了这么多,其实只涉及到用法,那么KVO的实现原理到底是怎样的呢?

1、其实当某个类的某个属性被注册监听的时候,系统会隐性的创建一个这个类的子类,以NSKVONotifying_+(当前类名)。
对应到Dog类就是NSKVONotifying_Dog。
2、在NSKVONotifying_Dog类实现中实现方法setAge,调用willChangeValueForKey和didChangeValueForKey方法

#import "NSKVONotifying_Dog.h"

@implementation NSKVONotifying_Dog

-(void)setAge:(int)age{
    [super setAge:age];
    
    [self willChangeValueForKey:@"age"];
    
    [self didChangeValueForKey:@"age"];
}
@end

这两个方法的作用是触发

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

方法执行。

上一篇下一篇

猜你喜欢

热点阅读