美文网首页2019IV
iOS-KVO实现原理

iOS-KVO实现原理

作者: 见哥哥长高了 | 来源:发表于2018-12-22 11:18 被阅读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
    

    方法执行。

    相关文章

      网友评论

        本文标题:iOS-KVO实现原理

        本文链接:https://www.haomeiwen.com/subject/vmhikqtx.html