KVO
1. code
![](https://img.haomeiwen.com/i803297/137ad41136204a30.png)
2. Debug
![](https://img.haomeiwen.com/i803297/5b2eec4032a04681.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
,应用层不变。
网友评论