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,应用层不变。

你可能感兴趣的:(02-蓦然回首 KVO & KVC)