[iOS进阶]自己动手写KVO总结

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

你可能感兴趣的:(ios,继承,KVO)