KVO的原理及项目使用

KVO也叫观察者模式,当被观察对象的某个属性发生更改时,观察者对象会获得通知。
KVO的实现实际上也是由强大的Runtime实现的,当你观察一个对象时,会动态创建一个该类的子类,并重写了被观察属性的 setter 方法。自然,重写的 setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象值的更改。最后把这个对象的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么 ) 指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例。

// 所有的 kvo 监听到事件,都会调用此方法
/*
 1. 观察的属性
 2. 观察的对象
 3. change 属性变化字典(新/旧)
 4. 上下文,与监听的时候传递的一致
 */
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;

1.重写setter方法的目的是为了在原有的setter方法中添加下面两个方法

- (void)willChangeValueForKey:(NSString *)key
- (void)didChangeValueForKey:(NSString *)key

2.重写了class 方法,企图欺骗我们这个类没有变,就是原本那个类。

  1. 重写dealloc方法,销毁新生成的NSKVONotifying_类
    4.KVO的缺点
    主要问题在KVO的回调机制,不能传一个selector或者block作为回调,而必须重写-addObserver:forKeyPath:options:context:方法所引发的一系列问题。而且只监听一两个属性值还好,如果监听的属性多了, 或者监听了多个对象的属性, 那有点麻烦,需要在方法里面写很多的if-else的判断。
    KVO原理详解,以及手动实现一个KVO

项目中使用,自定义下拉刷新和卡号四位➕一位空格

你可能感兴趣的:(KVO的原理及项目使用)