KVO理解

#import "ViewController.h"

#import "CFPerson.h"

@interface ViewController ()

@property (nonatomic,strong)CFPerson *person;

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    

    //键值监听

    //监听某个对象 属性的变化

    CFPerson *person = [[CFPerson alloc]init];

    self.person = person;

    person.name = @"高育良";

    person.height = 1.8;

    person.address = @"天上人间";

    

    

    NSLog(@"%@ %f %@",person.name,person.height,person.address);

    

    //KVO 底层

    //0>属性(例如height)变化,想监听值改变,我们可以重写set方法(-(void)setHeight:(CGFloat)height)就可以知道了,但是表面我们看不出来做了什么:实际上就是底层创建了个子类,重写setHeigt,方法,然后调用viewControlleobserveValueForKeyPath方法,把值传出去

    //1>创建一个NSKVONotifying_CFPerson子类继承制CFPerson

    //2>更改CFPerson isa 指针指向子类NSKVONotifying_CFPerson

    //3>保存所有参数 监听者  keyPath NSKeyValueObservingOptionOld context

    //4>重写NSKVONotifying_CFPersonset方法

    //  4.1>调用父类(CFPerson)setHeight

    //  4.2>调用监听者的observeValueForKeyPath这个方法 并且把信息传递出去

    [person addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionOld  context:nil];

    

    //改变了

    person.height = 1.6;

    

    

 

    //子类   自己没有就去父类里面找这个属性(多态)

    //isa  指针

    person.height = 1.5;

}

 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

 

    NSLog(@"%@",change);

}

 

- (void)dealloc

{

    [self.person removeObserver:self forKeyPath:@"height"];

}

posted @ 2017-05-15 09:52  codeFei  阅读(89)  评论(0)    收藏  举报