一、KVO
截屏2021-06-26 下午2.06.12.png
MJPerson有个属性age,这里对age进行KVO监听。
1、未添加KVO监听:
2、添加KVO监听后:

可见,进行KVO监听后,会动态生成MJPerson的一个子类。生成子类的目的是为了可以重写setAge方法:

二、KVC
1、特性
person->_age = 10。直接赋值成员变量是不会触发kvo的,因为没调用setting方法
但通过kvc设置成员变量是会触发kvo的,内部会主动掉你用willChangeValueForKey
didChangeValueForKey这两个方法。
oc定义了kvo特性,那么所有的kvc都得触发kvo,这才符合设计原理。可以认为kvo就是为kvc服务的。
2、setValueForKey的原理:
先去找方法,再去找成员变量。
3、valueForKey的原理:
也是一样,先找方法,再找成员变量。
网友评论