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,方法,然后调用viewControlle的observeValueForKeyPath方法,把值传出去
//1>创建一个NSKVONotifying_CFPerson子类继承制CFPerson
//2>更改CFPerson 的isa 指针指向子类NSKVONotifying_CFPerson
//3>保存所有参数 监听者 keyPath NSKeyValueObservingOptionOld context
//4>重写NSKVONotifying_CFPerson的set方法
// 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"];
}

浙公网安备 33010602011771号