KVO的实现原理,当我一旦使用KVO,他会帮我实现一个派生类,这个重写了我们的set方法,在执行set方法的时候,他会发送一条消息。
首先,我们创建一个Person对象,监听他的age的改变
给NSObject 创建一个分类,增加一个方法
- (void)sll_addObserver:(id)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
{
/*
1.runtime动态生成Person的子类(派生类)
2.重写KVO_Person的属性set方法,目的:监听属性有没有改变
3.修改对象的isa指针.
*/
// 修改isa
object_setClass(self, NSClassFromString(@"NSKVONotifying_Person"));
// 保存观察者对象
// self -> P;
// 动态添加属性
objc_setAssociatedObject(self, @"observer", observer, OBJC_ASSOCIATION_RETAIN);
}
派生类的实现
#import "NSKVONotifying_Person.h"
#import <objc/message.h>
@implementation NSKVONotifying_Person
- (void)setAge:(int)age
{
// super:标志,去执行父类方法
// 调用观察者的observeValueForKeyPath
[super setAge:age];
id observer = objc_getAssociatedObject(self, @"observer");
[observer observeValueForKeyPath:@"age" ofObject:self change:nil context:nil];
NSLog(@"执行了NSKVONotifying_Person setAge方法");
}
@end
网友评论