返回

一把钥匙解锁OC底层:探索对象的内存

IOS

输入

OC底层探索(三):对象的内存

输出

在一个真实的运行环境中,程序所用内存分为几个大类,包括堆、栈和静态内存。对于OC程序来说,对象的内存,主要存储于堆中,而且也是OC内存管理最主要的任务。

那么,对象的内存都有哪些特征呢?

1. 对象的内存对齐

  • 在内存中,变量的地址是必须是其类型的整数倍。
  • 比如,int类型变量的地址必须是4的整数倍,double类型变量的地址必须是8的整数倍。
  • 这样做的原因是,CPU在读取数据时,一次会读取多个字节,如果变量的地址不是其类型的整数倍,那么CPU就需要进行额外的计算来确定变量的起始地址,从而降低了程序的运行速度。
  • 对象的内存对齐原则与基本数据类型的内存对齐原则是一致的。

2. 结构体的内存对齐

  • 结构体(struct)是一种将多个数据类型的数据组合在一起的数据类型。
  • 结构体的内存对齐原则与基本数据类型的内存对齐原则是一致的,即结构体的第一个数据成员的地址必须是其类型的整数倍。
  • 但是,如果结构体中包含了不同类型的变量,那么结构体的内存对齐原则就变得更加复杂。
  • 这时候,结构体的内存对齐原则就需要考虑结构体中所有变量的类型的整数倍,并取其中最大的那个作为结构体的内存对齐值。
  • 比如,有一个结构体,其中包含了一个int类型的变量和一个double类型的变量,那么这个结构体的内存对齐值就是8,因为double类型的变量的整数倍是8。

3.对象的内存布局

  • 对象的内存布局是指对象在内存中的排列方式。
  • 对象的内存布局通常包括以下几个部分:
  • 实例变量区:存储对象的实例变量。
  • 类变量区:存储对象的类变量。
  • 方法区:存储对象的方法实现。
  • 对象的内存布局是编译器决定的,程序员无法直接控制对象的内存布局。

4. OC对象的内存管理

  • OC对象是在堆上创建的。
  • OC对象一旦被创建,就一直存在于堆上,直到它被释放为止。
  • OC对象的内存管理由ARC(Automatic Reference Counting)来完成。
  • ARC是一种自动引用计数机制,它会自动跟踪对象的引用计数,并在对象没有任何引用时,自动释放对象占用的内存。

5. OC对象的内存分配

  • OC对象的内存分配是由OC运行时系统来完成的。
  • OC运行时系统会维护一个自由内存池,当需要分配内存时,OC运行时系统就会从自由内存池中分配一块内存给对象。
  • 当对象被释放时,OC运行时系统就会将对象占用的内存归还给自由内存池。

通过对OC对象内存的深入了解,您就能更好地理解OC程序的运行机制,优化内存使用,提升程序性能。