内存分区以及block的存储位置

内存分区:

1、栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯一的。
    优点是快速高效,缺点时有限制,数据不灵活。

    PS:大量的局部变量、深递归、函数循环调用都可能耗尽内存而造成运行崩溃

2、堆区(heap) 由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如在ios 中 alloc 都是存放在堆中。

     由alloc分配的内存,速度比较慢,而且容易产生内存碎片,不过用起来最方便。

3、全局区(静态区) (static) 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后有系统释放。
注意:全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。

4、文字常量区 存放常量字符串,程序结束后由系统释放。

5、程序代码区 存放函数的二进制代码。

block的存储位置:

block块根据情况有两种可能的存储位置,一种存在代码区,一种存在堆区。

1、如果block块没有访问处于栈区的变量(比如局部变量),也没有访问堆区的变量(比如我们alloc创建的对象),那就存在代码区,即使访问了全局变量,也依然存在代码区。

2、如果访问了栈区或者堆区的变量,那就会被存在堆区(实际存在栈区,ARC下会自动拷贝到堆区)。

猜你喜欢

转载自www.cnblogs.com/huaixu/p/8858915.html