返回
iOS 深入理解类 & isa 的本质,面试常问常考
IOS
2024-02-01 00:42:55
前言
在 iOS 开发中,类是一个基础且重要的概念。理解类的本质及其与 isa 的关系,对于我们深入理解 iOS 底层原理至关重要。本文将从多角度剖析类与 isa,并精选多道经典面试题,对 isa 走位、继承关系和类结构进行了详细解析,帮助您全面掌握 iOS 底层原理。
一、类的本质
类是对象的抽象,它定义了对象的属性和行为。在 Objective-C 中,类使用 @interface
声明,并使用 @implementation
关键字实现。
类的本质是内存中的数据结构,它包含以下信息:
- 类名:类的名称
- 父类:类的父类
- 实例变量:类的实例变量
- 方法:类的实例方法和类方法
- 协议:类遵循的协议
二、isa 的本质
isa 是指向类对象的指针,它存储在每个对象的内存中。isa 指向的对象称为对象的类对象。
类对象也是一个对象,它包含以下信息:
- 类名:类的名称
- 父类:类的父类
- 实例变量:类的实例变量
- 方法:类的实例方法和类方法
- 协议:类遵循的协议
三、类的内存布局
在内存中,类对象和对象都是按照一定的格式存储的。如下图所示:
从图中可以看出,类对象和对象都包含以下部分:
- 实例变量:类的实例变量存储在对象中
- 方法:类的实例方法和类方法存储在类对象中
- isa:指向类对象的指针存储在对象中
四、经典面试题解析
1. 类存在几份?
由于类的信息在内存中永远只存在一份,所以类对象只有一份。
2. objc_object结构体
struct objc_object {
Class isa;
};
objc_object
结构体是 Objective-C 中所有对象的基类,它只包含一个成员变量 isa
,指向对象的类对象。
3. isa 走位
isa 走位是指 isa 指针在对象内存中的位置。isa 走位会影响对象的内存布局和访问速度。
在 Objective-C 中,isa 走位有两种方式:
- 窄 isa 走位 :isa 指针紧跟在对象的实例变量之后
- 宽 isa 走位 :isa 指针存储在对象的第一个字中
4. 继承关系
继承是面向对象编程中的一种重要机制,它允许子类继承父类的属性和行为。
在 Objective-C 中,子类可以通过 @interface
关键字声明继承父类。子类继承父类后,将获得父类的所有实例变量、方法和协议。
5. 类结构
类结构是指类在内存中的布局。类结构由以下部分组成:
- 类名:类的名称
- 父类:类的父类
- 实例变量:类的实例变量
- 方法:类的实例方法和类方法
- 协议:类遵循的协议
五、总结
本文深入剖析了类与 isa 的本质,并精选多道经典面试题,对 isa 走位、继承关系和类结构进行了详细解析。希望通过本文,您能对 iOS 底层原理有更深入的理解。