ios拓展19-KVO浅解

笔者在网上看到关于KVO的原理,往往都有运行时,并且写的比较详细. 但是要想看懂,首先要熟悉运行时的方法(至少用到的几个方法要知道), 对于新手门槛高,今天给大家来个简单浅显的讲解, 不涉及运行时方法.

ps:如果想知道KVO是如何通过运行时实现的,网上这方面资料很多,后期笔者也会增加

1. 下面是一个简单的kvo运用

@interface ViewController ()
@property (strong, nonatomic) Person    *person;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.person = [Person new];
    self.person.age = 18;//====person 只有一个age成员变量
    
    // kvo监听前  isa指针
    NSLog(@"isa:%@",[self.person valueForKeyPath:@"isa"]);
    
    // 添加监听者
    [self.person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
    
    // kvo监听后   isa指针
    NSLog(@"isa:%@",[self.person valueForKeyPath:@"isa"]);
    self.person.age = 20;
    
}
- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary *)change context:(nullable void *)context {
    NSLog(@"%@",change);
}
ios拓展19-KVO浅解_第1张图片
isa指针改变
2. 如果我们自定义个 NSKVONotifying_Person 类,
此时,程序运行会出错,  kvo其实就是通过运行时动态创建一个继承Person的子类, 并重写了被观察属性keyPath的setter 方法
当使用kvo监听,其实是监听NSKVONotifying_Person的,    
ios拓展19-KVO浅解_第2张图片
增加后,程序会报错

你可能感兴趣的:(ios拓展19-KVO浅解)