zoukankan      html  css  js  c++  java
  • KVO

    KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变

    原理

    利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类
    当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数
    _NSSetXXXValueAndNotify的内部调用如下

    调用willChangeValueForKey:
    调用原来的setter实现
    调用didChangeValueForKey;didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法

    相关问题

    • iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
      答:如上

    • 如何手动触发KVO?
      当 +(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key 返回是 YES,那么注册的这个 Key 就会替换对应的 Setter ,从而在改变的时候调用 -(void)willChangeValueForKey:(NSString *)key 与 -(void)didChangeValueForKey:(NSString *)key 发送通知给观察者。
      那么只要把自动通知设为 NO,并代码实现这两个通知方法,就可以达到手动触发的要求。

    + (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
        if ([key isEqualToString:@"object"]) {
            return NO;
        }
        
        return [super automaticallyNotifiesObserversForKey:key];
    }
    
    - (void)setObject:(NSObject *)object {
        if (object != _object) {
            [self willChangeValueForKey:@"object"];
            _object = object;
            [self didChangeValueForKey:@"object"];
        }
    }
    
    • 直接修改成员变量会触发KVO么?
      答:不会
  • 相关阅读:
    show master status, show slave status中的Executed_Gtid_Set
    MySQL分库分表
    数据库的读锁和写锁在业务上的应用场景总结
    MySQL死锁分析
    Java接口幂等性
    MySQL读写分离原理
    mysql 安装参考
    关于我
    【2020五校联考NOIP #6】最佳观影
    【2020五校联考NOIP #6】三格缩进
  • 原文地址:https://www.cnblogs.com/Lanht/p/11453157.html
Copyright © 2011-2022 走看看