自定义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;


这里面一共做了四个操作

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

2.创建子类

3.给子类绑定了set方法

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


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


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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面:今天周末,没有出门,就结合这两天学的,敲了这个demo, 水平有限,表要喷,当然很多都是站在大牛的肩膀上...
    lcc小莫阅读 380评论 1 2
  • kvo 观察者的本质是,是否有调用set方法 自定义KVO 实现观察People类的name属性 People.h...
    i玉米炖排骨阅读 314评论 0 0
  • 利用Runtime 实现简单的自定义kvo 代码githubgithub.com/zswj/custom-KVO ...
    我是数据链路层阅读 875评论 1 0
  • 自己实现kvo之前,需要知道iOS系统对kvo的实现。 系统实现kvo的原理 这依赖了OC强大的runtime特性...
    mws100阅读 2,796评论 6 3
  • 陪伴小子满满三天的集训终于结束了,小子满载而归。吃过晚饭看上去真的不想动弹,催促他洗澡,还算是听话。 洗澡后匆忙去...
    肖睿妈妈阅读 176评论 3 1