KVO原理:
当你观察一个对象时,一个新的类会动态被创建。这个类继承自该对象的原本的类,并重写了被观察属性的 setter 方法。自然,重写的 setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象值的更改。最后把这个对象的 isa 指针 ( isa 指针告诉 Runtime 系统这个对象的类是什么 ) 指向这个新创建的子类,对象就神奇的变成了新创建的子类的实例。
原来,这个中间类,继承自原本的那个类。不仅如此,Apple 还重写了 -class 方法,企图欺骗我们这个类没有变,就是原本那个类。更具体的信息,去跑一下 Mike Ash 的那篇文章里的代码就能明白,这里就不再重复。
运行时,当对象通过“self.”语法赋值时会触发setter方法,于是runtime机制通过对象isa指针去查找对应类方法,由于对象isa指针指向的是KVO中间类,于是调用了KVO中间类方法的setter方法,在setter方法中先触发了原类setter方法,并遍历通知所有观察对象值已经改变。
KVO缺陷
不能提供自定义的selector
不能传入block
自己实现KVO
那么自己实现KVO需要检查以下几点:
- 检查对象的类有没有相应的 setter 方法。如果没有抛出异常;
- 检查对象 isa 指向的类是不是一个 KVO 类。如果不是,新建一个继承原来类的子类,并把 isa 指向这个新建的KVO类;
- 检查对象的 KVO 类重写过没有这个 setter 方法。如果没有,添加重写的 setter 方法;
- 添加这个观察者
参考文章:http://www.cocoachina.com/ios/20150313/11321.html