iOS开发KVO底层实现

kvo(key value observe)用于一个对象监听另外一个对象的属性的改变。


kvo实现原理

kvo是基于runtime实现的,当一个对象第一次被观察的时候,系统会在运行时动态的为该对象所属的类添加一个派生类,然后将对象的isa指针指向这个派生类,该对象就变成了派生类的对象,在这个派生类中重写基类中所有被观察的属性的setter方法,然后由这个派生类中的setter方法负责通知属性的改变状况。

注意:

派生类除了重写基类的setter方法外还重写了下面两个方法
1> class:该方法是为了迷惑外部,让外部以为是本身的类实现的通知,验证可以通过在没有添加observe之前和添加observe之后分别打断点,在lldb调试窗口输入(lldb) po [self.object class]可以发现打印出来的都是基类,但是可以通过po object_getClassName(self.object)`发现在添加监听者之前和之后获得的类不一样,之前是object真正的类,之后使用一个给原来的类名前面添加了NSKVONotifying_的类,这个方法返回的是当前对象的isa指针真正指向的类
2> delloc,通过重写该方法来释放资源


派生类如何重写setter方法

  1. 先调用父类的setter方法
  2. 调用willChangeValueForKey:key,通知值将要改变
  3. 赋值
  4. 调用didChangeValueForKey:key,通知值已经改变,触发-(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary

KVO使用注意

  1. 给谁添加的观察者,谁就要remove观察者
  2. 要触发kvo,前提是间接或者直接调用setter方法
    • 直接:通过self.object方法来复制
    • 间接:通过kvc键值监听来赋值
  3. 添加了观察者之后,一定要实现-(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary方法,因为setter里面的didChangeValueForKey:key会触发该方法,要是找不到,就会崩溃
  4. 要保证被添加observe的对象有一个强引用,保证其不会被销毁,因为在ARC环境下,在添加观察者的时候,观察者对象和被观察的属性都不会被retain,在这些对象被释放后,相关的监听信息还存在,kvo所做的事情就是让程序崩溃.
  5. 5.

与NSNotificationCenter’区别

kvo和NSNotificationCenter都支持一对多
但是NSNotificationCenter需要发送通知

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值