返回
OC 底层原理 03:OC 对象本质与 isa
IOS
2023-12-04 04:53:46
### OC 对象的本质
在 OC 中,对象是程序的基本组成单位。每个对象都具有自己的数据和行为。数据通常被存储在对象的实例变量中,而行为则被定义在对象的类方法和实例方法中。
OC 对象的本质可以用一个结构体来表示:
struct OCObject {
Class isa;
// 对象的实例变量
};
其中,isa 指针指向对象的类。isa 指针在 OC 中非常重要,它决定了对象的类型,并影响了消息的转发。
### OC 对象的内部布局
OC 对象的内部布局可以分为两个部分:对象头和对象体。对象头包含了对象的一些基本信息,例如对象的 isa 指针、对象的引用计数、对象的类型等。对象体则包含了对象的实例变量。
对象头的布局如下:
struct OCObjectHeader {
Class isa;
int referenceCount;
unsigned int flags;
};
其中,isa 指针指向对象的类。referenceCount 字段记录了对象的引用计数。flags 字段记录了一些对象的标志位,例如对象的类型等。
对象体的布局则由对象的类决定。对象的类定义了对象的实例变量。实例变量可以是基本数据类型,也可以是其他对象。
### isa 指针的作用
isa 指针在 OC 中非常重要,它决定了对象的类型,并影响了消息的转发。
#### isa 指针决定了对象的类型
isa 指针指向对象的类。类的定义了对象的类型。因此,isa 指针可以用来确定对象的类型。
#### isa 指针影响了消息的转发
在 OC 中,消息的转发是由 isa 指针决定的。当一个对象收到一条消息时,OC 运行时会根据对象的 isa 指针找到对象的类,然后调用类的相应方法来处理这条消息。
### OC 中的消息转发机制
OC 中的消息转发机制是一个非常灵活的机制,它允许对象动态地响应消息。OC 中的消息转发机制可以分为两个步骤:
1. **消息接收者查找**
当一个对象收到一条消息时,OC 运行时会根据对象的 isa 指针找到对象的类。类的定义了对象的类型。因此,isa 指针可以用来确定对象的类型。
2. **消息方法查找**
找到对象的类后,OC 运行时会根据消息的选择器在类的类方法和实例方法中查找相应的方法。找到相应的方法后,OC 运行时会调用该方法来处理这条消息。
### OC 中的内存管理
OC 中的内存管理是由垃圾回收器来完成的。垃圾回收器会自动回收不再使用的对象,从而防止内存泄漏。
垃圾回收器的工作原理如下:
1. **标记阶段**
垃圾回收器会首先标记所有可达的对象。可达的对象是指从根对象出发,能够通过引用链到达的对象。
2. **清除阶段**
垃圾回收器会然后清除所有未标记的对象。未标记的对象是指那些从根对象出发,无法通过引用链到达的对象。
3. **整理阶段**
垃圾回收器会最后整理内存,将被清除的对象占用的内存空间释放出来。
### 总结
OC 对象的本质可以用一个结构体来表示。OC 对象的内部布局可以分为两个部分:对象头和对象体。对象头的布局如下。OC 对象的类型由 isa 指针决定。isa 指针影响了消息的转发。OC 中的消息转发机制可以分为两个步骤。OC 中的内存管理是由垃圾回收器来完成的。