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

2018-11-18  本文已影响0人  Bonucci

对象的代码块

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的方法列表中查找。

上一篇下一篇

猜你喜欢

热点阅读