美文网首页
KVO原理与手动调用

KVO原理与手动调用

作者: JeromeZhao | 来源:发表于2018-07-11 11:15 被阅读26次

KVO原理与手动调用

一、KVO

KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现。当被观察对象的某个属性发生更改时,观察者对象会获得通知。

二、KVO实现原理

  • KVO是基于runtime机制实现的。
//创建Person对象,添加work属性
@interface Person : NSObject
@property(nonatomic,copy) NSString * work;
@end

当某个类(Person)的属性(work)对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类(NSKVONotifying_Person),在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制

每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法。
键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey:一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而observeValueForKey:ofObject:change:context: 也会被调用。
派生类中setter方法调用如下(伪代码):

@implementation NSKVONotifying_Person
-(void)setWork:(NSString *)work{
    [self willChangeValueForKey:@"work"];
    NSLog(@"派生类work");
    [self didChangeValueForKey:@"work"];
}
@end

三、手动调用KVO

在Person类中添加类方法:

+(BOOL)automaticallyNotifiesObserversOfWork{
    return NO;
}

在观察Person类work属性被观察时的变化:


上述方法返回NO,则组织自动调用键值观察方法,在Person work setter方法里手动调用:

-(void)setWork:(NSString *)work{
    if (_work == work) {
        return;
    }
    [self willChangeValueForKey:@"work"];
    _work = work;
    [self didChangeValueForKey:@"work"];
}

测试结果:


相关文章

  • KVO原理与手动调用

    KVO原理与手动调用 一、KVO KVO 是 Objective-C 对观察者模式(Observer Patter...

  • iOS高级进阶之KVO

    KVO的原理 分析原理 使用 手动调用 自己实现KVO NSObject+KVOBlock.h NSObject+...

  • IOS问题与解答

    对KVO原理的理解: 问:如何手动触发一个value的KVO 答:主动调用: willChangeValueFor...

  • 04. KVO使用,原理,本质

    问题 KVO日常使用 KVO原理(KVO本质是什么) 如何手动触发KVO 直接修改成员变量会触发KVO吗 KVO图...

  • KVO和手动调用KVO

    参考链接: http://tech.glowing.com/cn/implement-kvo/ 手动实现KVO 1...

  • iOS面试题(4) KVO KVC

    声明,不是原创,笔记均来自 群主大神~ 手动实现KVO 什么是KVO和KVC? KVO内部实现原理 NSNotif...

  • 简单说一嘴KVO

    就说说手动调用和自动调用 KVO的调用很简单 什么是手动调用? 当我们按照上边的去监听了,每一次address属性...

  • 整理面试题

    一、OC语言基础知识剖析 (1)UI卡顿掉帧的原因 (1)什么是KVO? KVO实现原理?如何手动添加KVO? <...

  • KVC/KVO原理

    KVC/KVO原理 KVC setValue:forKey原理 调用setValue:forKey:方法,会直接寻...

  • iOS 自定义KVO

    通过在了解KVO的实现原理和实现步骤之后,我们可以手动实现KVO,具体可以看最后的demo,这里只讲实现原理 添加...

网友评论

      本文标题:KVO原理与手动调用

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