iOS:KVO的简单使用及其本质

来源:互联网 发布:2k18詹姆斯身体数据 编辑:程序博客网 时间:2024/06/07 07:26

KVO全称Key-Value Observer. 是观察者设计模式的一种实际应用.

KVO的操作对象是对象.

简单使用:

现在创建一个Person类,Person类中有一个age属性,当点击按钮的时候改变age属性的值


#import "ViewController.h"#import "Person.h"@interface ViewController ()@property(nonatomic,strong)Person *person;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    self.person = [[Person alloc]init];    self.person.age = @12;    //为person添加观察者 同时监听新值和旧值    [self.person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];}//按钮点击- (IBAction)btnClick {    self.person.age = @18;}//keyPath:监听的值 object:被观察的对象 change:包含新值和旧值- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{    NSLog(@"监听的值是:%@---被观察的对象是:%@---改变:%@",keyPath,object,change);}//移除观察者- (void)dealloc{    [self.person removeObserver:self forKeyPath:@"age"];}@end

输出结果:


KVO的本质:

如果我们用正常的方法监听一个对象的新值与旧值会采取下面的方法


在回调方法处打一个断点我们会发现被观察对象Person有一个NSKVONotifying_Person子类


其实KVO的本质就是在程序运行的过程之中,动态的产生一个被监听对象的子类,在这个子类之中重写被监听属性的set方法同时调用[super setXXX]方法,以实现对被监听对象属性的监听.

0 0