KVO
1. code

image.png
2. Debug

image.png
self.person.age = 10;正常认知都是调用 -setAge:方法。但如图方法栈所示,调用的Foundation模块下的_NSSetLongLongValueAndNotify方法。
从汇编符号文件,我们能看到_NSSetLongLongValueAndNotify内部调用了5个方法如下:
copyWithZone:willChangeValueForKey:didChangeValueForKey:_changeValueForKey:key:key:usingBlock:-
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 |
setAge:
一方面通过断点调式,NSKVONotifying_MTMPerson 重写了父类的setAge:方法,直接指向_NSSetLongLongValueAndNotify;另一个方面,获取setAge:方法的SEL,也可以证明。class
增加class方法,是为了开发者调用[self.person class]直接返回MTMPerson,应用层不变。