iOS KVO

作者: 飞不越疯人院 | 来源:发表于2019-04-11 09:44 被阅读2次

    1. 什么是KVO?

    1. KVO全称key-value observeing;
    2. KVOOC观察者设计模式的又一个实现;
    3. APPLE使用isa-swizling混写技术实现KVO;

    2. KVO实现流程?

    KVO的大致流程
    1. Object调用addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>方法添加监听者;
    2. 系统在运行时动态创建NSNotifying_Object类, 并将换来Obejct类的isa指针重新指向新创建的NSNotifying_Object ;

    isa混写技术在KVO中是如何应用的?
    isa指针修改进行重新指向的过程就是isa混写技术在KVO中的应用;

    1. NSNotifying_ObjectObject的子类, 通过重写NSNotifying_Object中的setter方法来通知所有的观察者;
    ///内部实现
    -(void)setCount:(NSInteger)count {
        [self willChangeValueForKey:@"keyPath"];
        ///调用父类实现
        [super setCount:count];
        ///此方法触发监听的实现方法observeValueForKeyPath....
        [self didChangeValueForKey:@"keyPath"];
    }
    
    第一个断点处, obj类型是AObject
    第二个断点处, obj类型是NSNotifying_AObject
    示例代码

    3. 触发KVO的方式?

    1. 通过Setter方法赋值;
    2. 通过KVC赋值;
    3. 通过成员变量赋值+手动触发
    ///单纯的成员变量赋值, 无法触发KVO
    - (void)increaseCount1 {
        _count ++;
    }
    
    ///成员变量赋值+手动触发KVO
    - (void)increaseCount2 {
        ///通过这两个方法可以手动触发KVO
        [self willChangeValueForKey:@"count"];
        _count ++;
        [self didChangeValueForKey:@"count"];
    }
    

    示例代码

    相关文章

      网友评论

        本文标题:iOS KVO

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