自定义KVO

KVO key-value observing简单的说就是一个对象观察另一个对象的属性变化。功能很强单,但搞起来比较麻烦,要写很多代码。所以我决定自定义一套kvo机制,使用block进行回调,这样做代码更加紧凑,也符合现在发展的潮流。

首先介绍一些kvo的原理。

1.当添加观察者的时候系统会创建被观察对象所在类的子类, 名字叫NSKVONotifying_xxxxx(xxxx是父类的名字)。

2.向这个子类添加set方法

3.将消息转发给父类

接下来我们按照系统的流程自己走一遍。

1.首先创建一个NSObject的分类(NSObject+CustomKVO),因为NSObject是基类。

2.自定义一个添加观察者的方法

- (void)kc_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath withHandle:(void(^)(id observer,id keyPath,id oldValue,id newValue))handle;


自定义KVO_第1张图片

这里面一共做了四个操作

1.过滤实例变量,因为它没有set方法

2.创建子类

3.给子类绑定了set方法

4.KC_Info *info = [[KC_Info alloc] initWithObserver:observer keyPath:keyPath handle:handle];将数据分装成一个对象保存到数组中。


自定义KVO_第2张图片

这个方法就是创建子类的具体实现


自定义KVO_第3张图片

重写set方法,为什么这样写,因为oc的底层是通过c实现的,oc的代码都会转成c函数,所以我们自己实现set方法的c函数。

你可能感兴趣的:(自定义KVO)