02-蓦然回首 KVO & KVC

KVO

1. code
image.png
2. Debug
image.png

self.person.age = 10;正常认知都是调用 -setAge:方法。但如图方法栈所示,调用的Foundation模块下的_NSSetLongLongValueAndNotify方法。

从汇编符号文件,我们能看到_NSSetLongLongValueAndNotify内部调用了5个方法如下:

  1. copyWithZone:
  2. willChangeValueForKey:
  3. didChangeValueForKey:
  4. _changeValueForKey:key:key:usingBlock:
  5. release
    这里保留一个疑问?

Runtime获取添加KVO前后的变化

When object_getClass class_copyMethodList supclass
before MTMPerson 1. setAge:
2. age
NSobject
after NSKVONotifying_MTMPerson 1. setAge:
2. class
3. dealloc
4._isKVOA
MTMPerson
  1. setAge:
    一方面通过断点调式,NSKVONotifying_MTMPerson 重写了父类的setAge:方法,直接指向_NSSetLongLongValueAndNotify;另一个方面,获取setAge:方法的SEL,也可以证明。

  2. class
    增加class方法,是为了开发者调用[self.person class]直接返回MTMPerson,应用层不变。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问题 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO ? 首先需要了解KVO...
    hjltony阅读 3,624评论 0 2
  • iOS底层原理总结--OC对象的本质(一) - 掘金 iOS底层原理总结--OC对象的本质(二) - 掘金 iOS...
    小李小李一路有你阅读 4,214评论 0 8
  • 面试问题: · iOS用什么方式实现对一个对象的KVO? · 如何手动触发KVO? 我们通过以下几个点来寻找这两个...
    高思阳阅读 1,670评论 0 1
  • KVO: KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变...
    曹来东阅读 3,775评论 0 0
  • 一、KVO的实现原理 KVO的全称是Key-ValueObserving(键值监听),可以用于监听某个对象属性值的...
    王的for阅读 4,680评论 1 0