笔者在网上看到关于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<NSString*, id> *)change context:(nullable void *)context {
NSLog(@"%@",change);
}
2. 如果我们自定义个 NSKVONotifying_Person 类,
此时,程序运行会出错, kvo其实就是通过运行时动态创建一个继承Person的子类, 并重写了被观察属性keyPath的setter 方法
当使用kvo监听,其实是监听NSKVONotifying_Person的,