码迷,mamicode.com
首页 > 其他好文 > 详细

KVO

时间:2019-09-03 16:14:29      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:oid   instance   代码   返回   动态   void   而在   观察   ring   

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么?
    答:不会

KVO

标签:oid   instance   代码   返回   动态   void   而在   观察   ring   

原文地址:https://www.cnblogs.com/Lanht/p/11453157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!