美文网首页
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"];

相关文章

  • 深入理解KVO

    iOS | KVO | Objective-C KVO的本质是什么,如何手动触发KVO? 1.什么是KVO KVO...

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

    参考:iOS底层原理总结 - 探寻KVO本质iOS-KVO本质 问题一:kvo如果找到对应的属性 KVO不存在查找...

  • Objective-C的本质

    Objective-C的本质 Objective-C的本质

  • Objective-C KVO的本质实现

    KVO KVO的全称是Key-Value Observing,键值监听,可以用于监听某个对象属性值的改变image...

  • KVO本质

    kvo本质是监听对象有没有调用set方法。假如对象属性是直接通过赋值方式改变的,则不会触发KVO机制。

  • KVO本质

    本质 runtime动态生成子类NSKVONotifying_NSPerson 修改了setAge:方法 子类 l...

  • KVO本质

    实现过程:对一个person类的实例对象A的一个属性添加kvo之后,会在runtime时生成一个person类的子...

  • KVO本质

    面试题: 简单使用: 发现:直接修改成员变量会 是不会触发KVO的.//分析:NSDictionary

  • KVO本质

  • KVO本质

    1.添加观察者的对象的isa指向的是NSKVONotifying_Person,未添加观察者的对象的isa指向的是...

网友评论

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

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