面试题答案
一键面试对象内存布局基本组成部分
- isa指针:每个对象都有一个isa指针,它指向对象的类。通过isa指针,对象可以找到它所属的类,进而获取类的元数据,包括方法列表、属性列表等信息。这是对象能够响应特定消息的基础。例如,当向一个对象发送
-message
消息时,runtime会通过isa指针找到对象的类,然后在类的方法列表中查找对应的实现。 - 实例变量:用于存储对象的具体数据。不同类型的实例变量占用不同大小的内存空间,它们紧密排列在对象的内存空间中。
实例变量的存储方式及与对象指针的关系
- 存储方式:实例变量在对象内存布局中紧跟在isa指针之后存储。它们按照声明顺序依次排列在内存中,占用连续的内存空间。例如,一个类定义了
int
类型和float
类型的实例变量,int
类型变量会先存储,然后紧接着存储float
类型变量。这种连续存储方式有利于提高内存访问效率,因为可以通过简单的内存偏移量快速访问到各个实例变量。 - 与对象指针的关系:对象指针实际上指向对象在内存中的起始地址,也就是isa指针的地址。要访问实例变量,runtime通过对象指针找到isa指针后,根据实例变量在类定义中的偏移量来定位具体的实例变量。例如,如果对象指针为
objPtr
,第一个实例变量的偏移量为offset1
,那么访问第一个实例变量的内存地址就是objPtr + offset1
。偏移量的计算是在编译期确定的,runtime根据类的元数据来获取这些偏移量信息,从而实现对实例变量的高效访问。