简单概述下 KVO 的实现:
当你观察一个对象时,一个新的类会动态被创建。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。自然,重写的 setter
方法会负责在调用原 setter 方法之前和之后,通知所有观察对象值的更改。最后把这个对象的 isa 指针 ( isa 指针告诉 Runtime
系统这个对象的类是什么 ) 指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例。
下面是代码实现
@interface ViewController ()@property (nonatomic, strong) NSMutableArray *array;
@end
@implementation ViewController- (void)dealloc{
//只要使用KVO,那就一定要写这移除观察者的方法
[self removeObserver:self forKeyPath:@"array"];
}
- (void)viewDidLoad {
[super viewDidLoad];
// 添加一个观察者
// 第一个参数 : 被观察者
//第一个self表示观察者
// 第二个参数 : 哪一个属性被观察
// 第三个参数 : 什么时候触发观察者的方法
// 第四个参数 : 保险,可以添加一些字符串
//谁去观察谁的那个属性,检查它变化的时间
self.array = [NSMutableArray array];
//KVC的方法 数组
[self addObserver:self forKeyPath:@"array" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil]; }- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{ NSArray *array = @[@"1", @"2"];
[[self mutableArrayValueForKeyPath:@"array"] setArray:array];
}
// 观察者模式触发的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context
{
NSLog(@"keyPath ==== %@", keyPath);
NSLog(@"object ===== %@", object);
NSLog(@"change ====== %@", change);
}