返回

iOS 深入理解类 & isa 的本质,面试常问常考

IOS

前言

在 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 底层原理有更深入的理解。