<pre>
// KVO的本质就是监听一个对象有没有调用set方法
//不使用@property的声明的属性是不会自动生成set与get方法 在这里_p ->_name 是调用_name的get方法 此时KVO 就监听不到_p的属性_name的改变
_p -> _name = i;
Person *p = [[Person alloc] init];
// 监听name属性有没有改变
[p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
_p = p;
通过重写KVO的- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context;方法可以对没有用property声明的对象进行监听 ,近而了解KVO的底层实现
</pre>
<pre>
/*
// 1.自定义NSKVONotifying_Person子类
// 2.重写setName,在内部恢复父类做法,通知观察者
// 3.如何让外界调用自定义Person类的子类方法,修改当前对象的isa指针,指向NSKVONotifying_Person
*/
// 把观察者保存到当前对象
objc_setAssociatedObject(self, (__bridge const void *)(observerKey), observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
// 修改对象isa指针
object_setClass(self, [XZYKVONotifying_Person class]);
// 通知观察者调用observeValueForKeyPath
// 需要把观察者保存到当前对象
// 获取观察者
id obsetver = objc_getAssociatedObject(self, observerKey);
[obsetver observeValueForKeyPath:@"name" ofObject:self change:nil context:nil];
使用自定义的方法
Person *p = [[Person alloc]init];
[p xzy_addObserver:self forKeyPath:@"name" options:0 context:nil];
实现KVO的监听
</pre>