一、KVO
kvo 当一个对象使用了kvo监听,iOS系统会修改这个对象的isa指针, 改为指向一个全新的通过Runtime动态创建继承该类的子类,子类拥有自己的set方法实现, set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、 didChangeValueForKey方法,而didChangeValueForKey方法内部 又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法
被监听的属性的值被修改时,就会自动触发KVO。 如果想要手动触发KVO,则需要我们自己调用willChangeValueForKey和 didChangeValueForKey方法即可在不改变属性值的情况下手动触发KVO ,并且这两个方法缺一不可。
子类一旦创建就会存储在内存中,但是之类实例对象是可以释放的,类是否存在和某个实例对象是否销毁是两个概念
子类中有几个方法记录:
1.isKVO 判断是否是KVO状态
2.class 还是指向原来的类,让外界无感知
3.dealloc 先释放子类在释放父类
4.setter 实际是调用子类setter方法进行消息发送
二、kvc
kvc是一种NSKeyValueCoding隐式协议所提供的机制。在iOS13之前可以通过KVC获取设置系统的私有属性,iOS13之后被禁用了。
kvc赋值过程如下图: