美文网首页
Objective-C的本质(4)—— KVO本质

Objective-C的本质(4)—— KVO本质

作者: yangfei02821 | 来源:发表于2020-04-26 12:34 被阅读0次

    参考:
    iOS底层原理总结 - 探寻KVO本质
    iOS-KVO本质

    问题一:kvo如果找到对应的属性

    • KVO不存在查找顺序问题,KVC才有一个查找顺序。
    • KVO完成条件1:拥有成员属性_key
      2:完成了setKey:方法的声明和实现
    • KVO监听属性实际上是给成员变量_key添加了监听,然后在setKey:方法中去实现C语言的函数_NSSetIntValueAndNotify,完成回调;
    • 监听的原理是监听setter方法。

    问题二:kvo如何创建出NSKVONotifying_这个类

    NSKVONotifying_Person是使用Runtime动态创建的一个新类,是原先类Person的一个子类,新类的superclass指向Person。
    新类重写了四个方法:

    • setKey: 实际上是调用了Foundation框架下的C语言的_NSSetIntValueAndNotify函数
    • class 屏蔽内部实现,隐藏了NSKVONotifying_MJPerson类的存在,避免开发者疑惑
    • dealloc 收尾工作
    • _isKVOA 返回YES,是kvo的监听

    思考的问题:

    1.当属性设置为只读,
    2.给成员变量添加监听
    上述两种形式下都没有setter方法的声明和实现,如何调用c语言的_NSSetXXXValueAndNotify函数
    通过kvc赋值,都可以触发监听
    问题:kvc内部实现是什么样的。

    kvc内部的确是有 __NSSetValueAndNotifyForKeyInIvar之类的调用,位于-[NSKeyValueIvarSetter initWithContainerClassIDcontainerIsa:ivar:],此外还有__NSKVONotifyingMutatorsShouldNotifyForIsaAndKey之类的函数,内部会获取_isKVOA的实现。

     // 通过KVC修改age属性
        [person setValue:@10 forKey:@"age"];
        // [person willChangeValueForKey:@"age"];
        // person->_age = 10;
        // [person didChangeValueForKey:@"age"];
    

    相关文章

      网友评论

          本文标题:Objective-C的本质(4)—— KVO本质

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