iOS_实例、类、元类、基类之间的关系+结构体

2022-07-20 14:37:14 浏览数 (2)

文章目录
  • isa指针
  • superClass
  • 对象的结构体
  • 类的结构体
  • 分类的结构体

isa指针

OC中任何类的定义都是对象,任何对象都有isa指针。isa是一个Class类型的指针。 实例的isa指针,指向类; 类的isa指针,指向元类; 元类的isa指针,指向根元类; 父元类的isa指针,也指向根元类!! 根元类的isa指针,指向它自己!!

superClass

类的superClass指向父类; 父类的superClass指向根类; 根类的superClass指向nil; 元类的superClass指向父元类; 父元类的superClass指向根元类; 根元类的superClass指向根类!!!!

  • 分类不能添加实例变量的原因? 分类结构体不包含实例变量数组, 分类是在依赖runtime加载的。而此时类的内存分布已经确定 (若此时再修改分布情况,对编程性语言是灾难,是不允许的)
  • 发送消息的查找过程? 沿着isa指针的方向查找

对象的结构体

代码语言:javascript复制
struct objc_object {
  Class isa  OBJC_ISA_AVAILABILITY; // 指向类对象
};

类的结构体

objc/runtime.h 中 objc_class 结构体的定义:

代码语言:javascript复制
struct objc_class {
  Class _Nonnull isa; // 指向元类
// 以下 OBJC2_UNAVAILABLE
  Class _Nullable super_class; // 父类
  const char * _Nonnull name; // 类名
  long version; // 类的版本信息,默认为0
  long info; // 类信息,供运行期使用的一些标识
  long instance_size; // 该类实例变量大小
  struct objc_ivar_list * _Nullable ivars; // 该类成员变量数组
  struct objc_method_list * _Nullable * _Nullable methodLists; // 方法数组
  struct objc_cache * _Nonnull cache; // 方法缓存
  struct objc_protocol_list * _Nullable protocols; // 协议数组
};

分类的结构体

objc/runtime.h 中 objc_category 结构体的定义:

代码语言:javascript复制
struct objc_category { // OBJC2_UNAVAILABLE
  char * _Nonnull category_name;
  char * _Nonnull class_name;
  struct objc_method_list * _Nullable instance_methods;
  struct objc_method_list * _Nullable class_methods;
  struct objc_protocol_list * _Nullable protocols;
}

0 人点赞