美文网首页iOS面试相关
KVO的底层实现?如何取消系统默认的KVO并手动触发(给KVO的

KVO的底层实现?如何取消系统默认的KVO并手动触发(给KVO的

作者: natewang | 来源:发表于2018-10-06 21:25 被阅读186次

    当观察某对象 A 时,KVO 机制动态创建一个对象A当前类的子类,并为这个新的子类重写了被观察属性 keyPath 的 setter 方法。setter 方法随后负责通知观察对象属性的改变状况。
    Apple 使用了 isa 混写(isa-swizzling)来实现 KVO 。当观察对象A时,KVO机制动态创建一个新的名为:NSKVONotifying_A 的新类,该类继承自对象A的本类,且 KVO 为 NSKVONotifying_A 重写观察属性的 setter 方法,setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象属性值的更改情况。

    修改

    使用方法,可实现取消系统kvo,自己触发,也就可控。

    +(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
        if ([key isEqualToString:@"name"]) {
            return NO;
        }else{
            return [super automaticallyNotifiesObserversForKey:key];
        }
    }
    -(void)setName:(NSString *)name{
        
        if (_name!=name) {
            
            [self willChangeValueForKey:@"name"];
            _name=name;
            [self didChangeValueForKey:@"name"];
        }
          
    }
    
    

    相关文章

      网友评论

        本文标题:KVO的底层实现?如何取消系统默认的KVO并手动触发(给KVO的

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