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

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

作者: 晴川历历汉阳树丶 | 来源:发表于2020-05-12 10:18 被阅读0次

1.底层实现

1.当某个类添加了监听时,系统会动态的为该类创建一个子类,并且把isa指向该类的子类,然后重写监听属性的set方法。在willChangedValueForKey方法里面对old赋值,在didChangedValueForKey里面对new赋值,并调用监听触发方法。

2.手动触发,设定触发条件

//该方法内拦截系统的响应
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
    if ([key isEqualToString:@"age"]) {
        return false;
    }
    return [super automaticallyNotifiesObserversForKey:key];
}
- (void)setAge:(NSInteger)age {
    //判断条件是否满足
    if (age > 18) {
        //条件满足之后赋值并手动触发kvo
        [self willChangeValueForKey:@"age"];
        //由于已经在系统方法处进行的对age的拦截,所以直接赋值的时候不会响应到kvo
        _age = age;
        [self didChangeValueForKey:@"age"];
    }else{
        _age = age;
    }
}

相关文章

网友评论

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

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