筆者在網上看到關于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);
}
isa指針改變
2. 如果我們自定義個 NSKVONotifying_Person 類,
此時,程序運行會出錯, kvo其實就是通過運行時動態創建一個繼承Person的子類, 并重寫了被觀察屬性keyPath的setter 方法
當使用kvo監聽,其實是監聽NSKVONotifying_Person的,
增加后,程序會報錯