__block的作用和内存分区
2018-04-11 本文已影响19人
记忆的北极
这里我直接就把本文的重点写出来:
一, __block的作用
__block的根本作用就是把block的外部变量的地址,从栈区放到堆区.
__block只要观察到某一个成员变量被block所持有,就会把该变量的内存地址从栈区放到堆区,因此在堆区的该成员变量就会变成有用户自己分配和释放,不会被系统管理造成丢失.
二,内存的5个分区
1,栈区(stack):存放函数局部变量和函数的参数,有系统管理分配和收回
2,堆区(heap):存放由用户手动new对象的内存区域,分配是使用alloc, 释放:release, autorelease
ARC的管理是在编译的时候自动retain,release,autorelease的.
3,全局区/静态区(static):存放全局变量和静态变量,该区又分为.bbs区和data区, bbs区存放的是有初始化的全局变量和静态变量. data区存放的是未初始化的全局变量和静态变量.
4,常量区(const):存放常量的内存区
5,代码区:存放函数的二进制代码区
内存的分区如图
iOS的底层是基于Unix的, 而Android的底层则是基于Linux的,所以iOS和Android的底层分区管理是基本相等的.
栈区存放高地址, 代码区存放低地址.而且区与区之间是不连续的.在程序启动的整个过程中,代码区,长两驱,全局区/静态区的大小是固定的, 不会变化的,而只有栈区和堆区是有系统分配管理的,这两个区的大小是时刻发生变化的(堆区的释放,栈区的进入进出).
栈区 |
堆区 |
全局区/静态区 |
常量区 |
代码区 |