返回 元类中的
iOS 底层原理:揭秘类、元类和 bits(上)
IOS
2024-02-16 17:11:57
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 的底层原理。下一期,我们将继续探索类的内部结构,深入研究类的实例变量和方法的实现。