KVO的底层实现原理

来源:互联网 发布:图片分析软件 编辑:程序博客网 时间:2024/05/16 04:00

KVO 的底层实现原理 :

首先创建一个类: Peron

Person 有两个属性

@property (nonatomic,strong)NSString * name;

@property (nonatomic,assign)CGFloat height;


在控制器来定义一个属性 Person 用来保存创建的Person

@property (nonatomic,strong)Person * p;


创建Person对象 并监控person 属性 height 的改变

 Person * p =[[Person alloc] init];    self.p = p;    p.name = @"张三";    p.height = 170;        //添加KVO 监控 p 当中 属性height 的改变    [p addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];        p.height = 180;


监控值改变以后打印值得变化

-(void)dealloc{    [self.p removeObserver:self forKeyPath:@"height"];}//监控属性变化触发的方法..-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{    if ([keyPath isEqualToString:@"height"]) {                NSLog(@"%@",change);            }}

    //做了哪些事情

    //1.动态的创建一个叫NSKVONotifying_Person 的子类

    //2.更改之前类的 isa指针为子类

    //3.传入一堆参数 1.监听者(将来调用observeValueForKeyPath)  2.keypath(决定了重写哪个set方法)  3.枚举(决定传哪些给你) 4.携带参数

    //4.根据keypath 重写子类的set方法

    //5.在子类的set方法中 根据枚举 保存所有的属性值 然后调用父类的set方法然后用监听者的observeValueForKeyPath... 把对应的值传出去通知监听者发生了事情






//系统相当于创建了一个子类

@interface NSKVONotifying_Person :Person

@end


//在子类里重写了父类的setHeight 方法

@implementation NSKVONotifying_Person


-(void)setHeight:(CGFloat)height

{

    self.height = height;

    //重写了set方法并在里面做了一些事情

    

    //调用了 observeValueForKeyPath方法..

        

}




@end



0 0