zoukankan      html  css  js  c++  java
  • KVO的底层实现原理?如何取消系统默认的KVO并手动触发?

    • KVO是基于runtime机制实现的
    • 当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类(该类的子类),在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制
    • 如果原类为Person,那么生成的派生类名为NSKVONotifying_Person
    • 每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法
    • 键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey: 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。
    • 补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类 

    // 添加对Account的监听

            [self.account addObserver:self forKeyPath:@"balance" options:NSKeyValueObservingOptionNew context:nil];

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{

        if([keyPath isEqualToString:@"balance"]){

            NSLog(@"keyPath=%@,object=%@,newValue=%.2f,context=%@",keyPath,object,[[change objectForKey:@"new"] floatValue],context);

        }

    }

    -(void)dealloc{

        [self.account removeObserver:self forKeyPath:@"balance"];  //移除监听

    }

    修改使用方法,可实现取消系统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"];

        }

        

    }

  • 相关阅读:
    linux入门系列8--shell编程入门
    linux入门系列7--管道符、重定向、环境变量
    linux入门系列6--软件管理之rpm和yum仓库
    linux入门系列5--新手必会的linux命令
    linux入门系列4--vi/vim编辑器
    linux入门系列3--常见的linux远程登陆管理工具
    linux入门系列2--CentOs图形界面操作及目录结构
    Linux入门系列1--环境准备及Linux安装
    曾经我也有一个做游戏的梦想,这几本游戏开发的书籍推荐给为未来的游戏工程师
    互联网公司的敏捷开发是怎么回事?这一份软件工程书单送给你!
  • 原文地址:https://www.cnblogs.com/huangzs/p/7515653.html
Copyright © 2011-2022 走看看