自定义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小莫阅读 282评论 1 2
  • kvo 观察者的本质是,是否有调用set方法 自定义KVO 实现观察People类的name属性 People.h...
    i玉米炖排骨阅读 185评论 0 0
  • 利用Runtime 实现简单的自定义kvo 代码githubgithub.com/zswj/custom-KVO ...
    我是数据链路层阅读 721评论 1 0
  • 自己实现kvo之前,需要知道iOS系统对kvo的实现。 系统实现kvo的原理 这依赖了OC强大的runtime特性...
    mws100阅读 2,610评论 6 3
  • 陪伴小子满满三天的集训终于结束了,小子满载而归。吃过晚饭看上去真的不想动弹,催促他洗澡,还算是听话。 洗澡后匆忙去...
    肖睿妈妈阅读 85评论 3 1
  • #import "ViewController.h"#import "HttpResquestHelper.h"@...
    艾克12138阅读 233评论 0 0
  • 曾经看过一部舒淇和彭于晏主演的电影《剩者为王》,它讲的是“剩女”这个话题。 其实近年来,关于“剩女”的影视作品甚至...
    苏秋虞阅读 340评论 0 10