返回

揭秘iOS 底层:isa 的前世今生

IOS

isa 的前世今生

isa 的作用

isa 是一个指向对象所属类的指针,在 Objective-C 中,每一个对象都会有一个 isa 指针,指向该对象所属的类。isa 指针在 Objective-C 中发挥着至关重要的作用,它决定了对象的类型、对象的属性和方法。

isa 的实际数据结构

isa 的实际数据结构是一个指针,指向该对象所属的类。该类是一个数据结构,包含该类中所有实例变量、方法和属性的定义。isa 指针还包含了一些其他信息,例如对象的引用计数、对象的类型编码等。

isa 中不同二进制位存储的内容说明

isa 指针中存储的信息包括:

  • 对象的引用计数:引用计数记录了该对象被引用的次数,当引用计数为 0 时,该对象将被销毁。
  • 对象的类型编码:类型编码记录了该对象的数据类型,例如 int、float、char* 等。
  • 对象的类指针:类指针指向该对象所属的类。

isa 优化

为了提高 isa 的性能,Objective-C 引入了 isa 优化。isa 优化是一种将 isa 指针和对象的数据存储在同一个内存块中的技术。这样可以减少内存访问次数,提高性能。

isa 是否为 TaggedPoint

TaggedPoint 是一个数据结构,它将一个指针和一个标记位存储在同一个内存块中。isa 指针是否为 TaggedPoint 取决于 Objective-C 的实现。在某些 Objective-C 实现中,isa 指针是 TaggedPoint,而在其他 Objective-C 实现中,isa 指针不是 TaggedPoint。

以引用计数为例实际探索 isa 的指向

引用计数是一种内存管理机制,它记录了每个对象被引用的次数。当一个对象的引用计数为 0 时,该对象将被销毁。

以下是一个以引用计数为例实际探索 isa 指向的示例:

// 创建一个对象
id object = [[NSObject alloc] init];

// 获取对象的 isa 指针
Class isa = object_getClass(object);

// 打印 isa 指针的值
NSLog(@"isa: %p", isa);

// 释放对象
[object release];

在上面的示例中,object_getClass() 函数返回了对象的 isa 指针。NSLog() 函数打印了 isa 指针的值。当对象被释放后,isa 指针的值将变为 NULL。

isa 的指向

isa 指向对象所属的类。类是一个数据结构,包含该类中所有实例变量、方法和属性的定义。isa 指针还指向一些其他信息,例如对象的引用计数、对象的类型编码等。

SuperClass 的指向探索

SuperClass 指针指向该类的父类。父类是一个数据结构,包含该类中所有实例变量、方法和属性的定义。SuperClass 指针还指向一些其他信息,例如类的引用计数、类的类型编码等。

以下是一个探索 SuperClass 指向的示例:

// 创建一个对象
id object = [[NSObject alloc] init];

// 获取对象的 isa 指针
Class isa = object_getClass(object);

// 获取类的父类 isa 指针
Class superclass = class_getSuperclass(isa);

// 打印父类 isa 指针的值
NSLog(@"SuperClass isa: %p", superclass);

在上面的示例中,class_getSuperclass() 函数返回了类的父类 isa 指针。NSLog() 函数打印了父类 isa 指针的值。