返回

iOS 底层原理:揭秘类、元类和 bits(上)

IOS

iOS底层原理03-类,元类,bits(上)

前言

上一期,我们探讨了 Objective-C 对象的底层本质,并通过对象的 isa 指针发现了类。那么,类的本质又是什么呢?本期,我们将深入探究类的内部结构,了解类和元类之间的关系,以及 bits 在类中的作用。

类与元类

在 Objective-C 中,类不仅是对象的模板,也是一个对象,称为元类。每个类都有一个与之对应的元类,该元类负责管理类本身。元类的 isa 指针指向根元类 NSObject 的元类,而 NSObject 的元类则指向自身。

元类中的 bits

元类的结构中包含了一个称为 bits 的成员,它是一个 32 位的无符号整数,存储着类的各种信息和标志。bits 的格式如下:

|                 |                 |                 |                 |
|------------------|------------------|------------------|------------------|
| unused (12 bits) | JV (1 bit)       | U (1 bit)         | H (1 bit)         |
|------------------|------------------|------------------|------------------|
| un (1 bit)       | F (1 bit)         |  RC (2 bits)      | RO (3 bits)        |
|------------------|------------------|------------------|------------------|
| RB (4 bits)       | AC (3 bits)        | IG (1 bit)        |  RW (2 bits)        |
|------------------|------------------|------------------|------------------|
| SI (2 bits)       | SW (1 bit)        | RW (2 bits)        |  ALL_RW (1 bit)    |
|------------------|------------------|------------------|------------------|

其中,各个字段的含义如下:

  • unused (12 bits) :未使用。
  • JV (1 bit) :泛型类型标记。
  • U (1 bit) :Unknown标记。
  • H (1 bit) :隐藏标记。
  • un (1 bit) :无符号标记。
  • F (1 bit) :快速 isa 标记。
  • RC (2 bits) :引用计数类型标记。
  • RO (3 bits) :只读类型标记。
  • RB (4 bits) :弱引用类型标记。
  • AC (3 bits) :属性类型标记。
  • IG (1 bit) :内部泛型类型标记。
  • RW (2 bits) :可读可写类型标记。
  • SI (2 bits) :结构体索引标记。
  • SW (1 bit) :结构体扩展标记。
  • RW (2 bits) :可读可写类型标记。
  • ALL_RW (1 bit) :所有属性可读可写的标记。

bits 的作用

bits 中的各个字段控制着类的不同方面:

  • JV :表示该类是否是一个泛型类型。
  • U :表示该类是否是一个未知类型,即它没有定义 superclass。
  • H :表示该类是否是一个隐藏类,即它不能被直接实例化。
  • un :表示该类是否是一个无符号类型。
  • F :表示该类是否支持快速 isa。
  • RC :表示该类引用计数的类型。
  • RO :表示该类的只读属性类型。
  • RB :表示该类的弱引用类型。
  • AC :表示该类的属性类型。
  • IG :表示该类是否是一个内部泛型类型。
  • RW :表示该类的可读可写属性类型。
  • SI :表示该类的结构体索引。
  • SW :表示该类的结构体扩展标记。
  • ALL_RW :表示该类的所有属性都可读可写。

结语

通过了解类和元类,以及 bits 在类中的作用,我们进一步深入理解了 Objective-C 的底层原理。下一期,我们将继续探索类的内部结构,深入研究类的实例变量和方法的实现。