引
block是iOS开发中一种使用方便的代码块,但是在使用过程中也很容易不小心就造成问题,本文讲解其存储位置所决定的内存修饰以及如何避免循环引用。
iOS内存分区
先讲讲大的,关于iOS在内存中的分区情况。
内存分为五个区:栈区、堆区、全局区、常量区、代码区。这五个区在物理上是分开的,如下图所示:
这五个区存储的内容也各有划分:
- 栈区(stack):这一块区域系统会自己进行管理,我们不用干预,主要存一些局部变量,以及函数跳转时的现场保护。因此大量的局部变量、深递归、函数循环调用都可能耗尽内存而造成运行崩溃。
- 堆区(heap):与栈区相对,这一块一般由我们开发人员管理,比如一些alloc、free的操作,存储一些自己创建的对象。
- 全局区(静态区 static):全局变量和静态变量都存储在这里,已经初始化的和没有初始化的变量会分开存储在相邻的区域,程序结束后系统来释放。
- 常量区:存储常量字符串和const常量。
- 代码区:顾名思义,就是存我们写的代码。