聊聊KVO

作者: FishSha | 来源:发表于2018-11-20 09:12 被阅读5次

iOS中的KVO用起来还是蛮爽的,特别适合用在Model更改后刷新UI等操作,可以很方便的监听一个对象属性值的变化,只需要对目标对象添加观察者即可

了解了基本操作后,我们再深入了解下它是如何实现的

那我们从addObserver函数开始,函数接受四个参数,分别是:

  • observer:注册KVO的对象,且需要实现了observeValueForKeyPath:ofObject:change:context:方法

  • keyPath: 接受消息的关键路径,不能为空,可在接受函数中通过判断改值,筛选被观察的对象

  • options:设置通知方式

  • context:传递给接受函数的内容,可为nil
    其他没什么说的,主要说一下options这个参数,该参数接受NSKeyValueObservingOptions类型的枚举,总共有一下四个类型:

  • NSKeyValueObservingOptionNew //在接收器chagne参数中传递被修改后的新值

  • NSKeyValueObservingOptionOld //在接收器change参数中传递被修改前的旧值

  • NSKeyValueObservingOptionInitial //在注册观察者时,会先向接受者发送一次消息

  • NSKeyValueObservingOptionPrior //在被观察对象修改前和修改后,都向接收器发送一次消息

了解了注册观察者的详细后,下面我们来对比下注册观察者和未注册观察的内存关系对比

未注册的对象

从图中我们可以看到,未添加的KVO监

听的对象,isa直接指向它的类Person
下面看下注册了观察者的对象

可以看到在对象和类中间多了一个NSKVONotifyingPersonClass,该类是由runtime动态生成,在我们去给对象sam的age属性赋值时,setAge方法会调用Foundation中的_NSSetIntValueAndNotify方法,_NSSetIntValueAndNotify方法内部会依次调用

  • willChangeValueForKey

  • super setAge

  • didChangeValueForKey

(如果需要验证以上调用顺序,我们可以在Person内重写以上方法验证)

随后会向接收器发送消息,也就是我们上面所说的observeValueForKeyPath:ofObject:change:context监听函数。

相关文章

  • 聊聊KVO

    iOS中的KVO用起来还是蛮爽的,特别适合用在Model更改后刷新UI等操作,可以很方便的监听一个对象属性值的变化...

  • 聊聊 KVO

    引用:http://khanlou.com/2013/12/kvo-considered-harmful/ 细数K...

  • iOS-KVO浅谈

    上一篇:iOS-KVC浅谈 前言:KVO 作为 KVC 的同袍兄弟,功能更强大,聊聊 KVO。 一、KVO 简介 ...

  • 聊聊 KVO 与 KVC 吧

    先聊聊 KVO 与 KVC 的区别吧:KVO是指键-值-观察者模式, 键值监听, 监听一个对象属性值的改变。KVO...

  • 聊聊 KVC KVO

    KVC NSKeyValueCoding 协议 键值编码(key-value),指定的key获取对应value...

  • iOS之解耦机制

    聊聊delegate, block, notification, KVO 一 高内聚低耦合是软件设计永恒的主题之一...

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

  • 04. KVO使用,原理,本质

    问题 KVO日常使用 KVO原理(KVO本质是什么) 如何手动触发KVO 直接修改成员变量会触发KVO吗 KVO图...

  • 20.iOS底层学习之KVO 原理

    本篇提纲1、KVO简介;2、KVO的使用;3、KVO的一些细节;4、KVO的底层原理; KVO简介 KVO全称Ke...

  • 深入理解KVO

    iOS | KVO | Objective-C KVO的本质是什么,如何手动触发KVO? 1.什么是KVO KVO...

网友评论

      本文标题:聊聊KVO

      本文链接:https://www.haomeiwen.com/subject/asctqqtx.html