美文网首页
iOS底层学习4 -- KVO,KVC底层原理

iOS底层学习4 -- KVO,KVC底层原理

作者: 恋空K | 来源:发表于2020-04-28 23:37 被阅读0次


    当给一个对象添加了监听器的话,当不使用这个对象的时候,需要移除监听器




    由上图可以出,person1的类对象变成了NSKVONotifying_MJPerson
    person2的类对象还是MJPerson




    NSKVNotifying_MJPerson是是用runtime动态创建的一个类,是MJPerson的子类

    IMP就是方法的实现。runtime里面有一个方法叫methodForSelector:(SEL),这方法的含义就是:只要传一个方法名进去,就会告诉你方法的具体实现在哪。打印下方法的内存地址,就知道那个方法在哪




    NSObject 的class现实应该是
    • (Class)class {
      return object_getClass(self);返回的是对象的真实类型
      }
      所以动态生成的派生类,重写class方法的目的是为了隐藏NSKVONotifying_MJPerson类的存在,也就是隐藏内部实现





      直接修改成员变量不会触发KVO,因为KVO的本质是重写set方法。但是我们可以通过上图手动触发KVO,在修改成员变量的时候,也能触发监听器的监听方法。




      上图中的两行代码完全等价

      KVC直接修改成员变量也是可以触发KVO的
      KVC内部有做KVO监听的一个相关操作
      也就是KVC还是能触发KVO,我就不管你有没有调用set方法


      KVC的底层现实可以理解为上图

    • (BOOL)accessInstanceVariablesDirectly方法默认返回的是YES,也就是说默认是可以直接访问对象的成员变量的


    相关文章

      网友评论

          本文标题:iOS底层学习4 -- KVO,KVC底层原理

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