/ iOS 开发

iOS 中的堆和栈

在 iOS 里,程序运行过程中产生的数据都是存放在内存中的,不同的数据在内存中存放的位置也不同。

堆区(heap)

heap 与动态内存分配相关,内存可以随时在堆中分配和销毁。我们需要明确的请求内存分配与销毁。 简单来说,就是 malloc 与 free。

特点

  • 由程序员负责分配释放,释放不当容易产生内存泄露;
  • 系统使用链表存储空闲内存地址,所以是不连续的。链表的遍历方向是由低地址向高地址;
  • 堆的大小受限于系统中有效的虚拟内存,所以堆的空间比较灵活,也比较大。但是容易产生碎片,效率较低。

数据存储

所有的对象。

栈区(stack)

在现代操作系统中,一个线程会分配一个stack. 当一个函数被调用,一个stack frame(栈帧)就会被压到stack里。里面包含这个函数涉及的参数,局部变量,返回地址等相关信息。当函数返回后,这个栈帧就会被销毁。而这一切都是自动的,由系统帮我们进行分配与销毁。对于程序员是透明的,我们不需要手动调度。

特点

  • 由编译器自动负责分配、释放,效率较高。
  • 只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
  • 栈是向低地址扩展的数据结构,是一块连续的内存区域,从栈获得的空间较小。

数据存储

存放函数的参数、局部变量等等。