IOS 响应式编程思想,KVO的实现原理

2020-08-10  本文已影响0人  越天高

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
上一篇下一篇

猜你喜欢

热点阅读