揭秘iOS 底层:isa 的前世今生
2023-10-18 16:34:36
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 指针的值。