美文网首页
KVO的本质

KVO的本质

作者: 我真的不是张亮 | 来源:发表于2018-08-07 21:08 被阅读12次

    1、如果你给一个Person实例添加KVO,那么这个实例的的isa指针指向的是派生出来了NSKVONotification_Person类对象,折耳根类对象是Runtime动态创建出来的,只要添加了KVO就会创建,他只是Person的一个子类,NSKVONotification_Person的superclass指向的还是Person这个类

    2、NSKVONotification_Person中重写了你监听属性的set方法,这个set方法调用了NSSetInt(XXX类型而已)ValueAndNotify方法

    3、NSSetInt(XXX类型而已)ValueAndNotify方法的实现

    [self willChangeValueForKey];

    [super setAge:age];//调用父类的set方法

    [self didChangeValueForKey];

    4、didChangeValueForKey 这个方法会调用监听起的observeValueForkeyPath方法

    5、派生类NSKVONotification_Person中除了有重写setAge方法,还有dealloc  classs  _isKVO 方法

    KVO的本质

    1、利用Runtime给对象的类添加一个NSKVONotification_XXX的派生类,并且让这个实例对象的isa指针指向这个派生类

    2、当被监听的属性发生改变时,会通过实例的isa指针找到这个派生类,调用派生类里面的set方法

    3、派生类中的set方法调用了NSSetXXXValueAndNotify方法

    4、NSSetXXXValueAndNotify这个方法中又调用了

    willChangeValueForKey

    [super setXXX:]

    didChangeValueForKey;

    5、didChangeValueForKey中又调用了observer的observerValueForKeyPayh方法

    手动触发KVO

    可以自己手动调用willChangeValueForKey 和 didChangeValueForKey

    直接诶修改成员变量的值(person->age = 10),是不会掉用KVO的,因为没有调用set方法,如果你要能够监听到KVO,那么你需要手动调用willChangeValueForKey 和 didChangeValueForKey

    相关文章

      网友评论

          本文标题:KVO的本质

          本文链接:https://www.haomeiwen.com/subject/qpfzvftx.html