KVO的底层实现?如何取消系统默认的KVO并手动触发(给KVO的触发设定条件:改变的值符合某个条件时再触发KVO)?

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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容