美文网首页
Objective-C的对象模型与运行时

Objective-C的对象模型与运行时

作者: Bonucci | 来源:发表于2018-11-18 13:30 被阅读0次

    对象的代码块

    typedef struct objc_class *Class;
    typedef struct objc_object {
        Class isa;
    } *id;
    

    Objective-C的对象就是一个包含isa指针的数据结构,而isa又是一个Class类型的,Class则是一个名为objc_class的数据结构定义。

    runtime.h中对objc_class的定义:

    
    struct objc_class {
      Class isa  OBJC_ISA_AVAILABILITY;
      #if !__OBJC2__
      // 父类
      Class super_class                                  OBJC2_UNAVAILABLE;
      // 类名
      const char *name                                   OBJC2_UNAVAILABLE;
      // 类版本信息
      long version                                       OBJC2_UNAVAILABLE;
      // 类信息
      long info                                          OBJC2_UNAVAILABLE;
      // 类实例变量大小
      long instance_size                                 OBJC2_UNAVAILABLE;
      // 类成员变量列表
      struct objc_ivar_list *ivars                       OBJC2_UNAVAILABLE;
      // 类方法列表
      struct objc_method_list **methodLists              OBJC2_UNAVAILABLE;
      // 类方法缓存
      struct objc_cache *cache                           OBJC2_UNAVAILABLE;
      // 类协议列表
      struct objc_protocol_list *protocols               OBJC2_UNAVAILABLE;
      #endif     
    } OBJC2_UNAVAILABLE;
    
    作者:iEzreal
    链接:https://www.jianshu.com/p/7edece26de7f
    

    isa:在Objective-C中,类自身也是一个对象,这个对象的isa指针指向metaClass(元类)

    super_class:指向该类的父类,如果该类已经是最顶层的根类(如NSObject或NSProxy),则super_class为NULL。

    cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。在实际使用中,这个对象只有一部分方法是常用的,很多方法其实很少用或者根本用不上。这种情况下,如果每次消息来时,我们都是methodLists中遍历一遍,性能势必很差。这时,cache就派上用场了。在我们每次调用过一个方法后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果cache没有,才去methodLists中查找方法。这样,对于那些经常用到的方法的调用,但提高了调用的效率。

    version:我们可以使用这个字段来提供类的版本信息。这对于对象的序列化非常有用,它可是让我们识别出不同类定义版本中实例变量布局的改变。

    元类(Meta Class)
    元类存储着一个类的所有类方法,当我们向一个对象发送消息时,runtime会在这个对象所属的这个类的方法列表中查找方法;而向一个类发送消息时,会在这个类的meta-class的方法列表中查找。

    相关文章

      网友评论

          本文标题:Objective-C的对象模型与运行时

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