一、Bolck 是OC中一类对象,顶级父类也是NSObject。
Block的作用类似于函数,可以像变量一样进行传递。
__NSGlobalBlock__:全局block, 类似于我们创建的函数,会被存放在内存区域中的数据区。数据区用来存储全局的变量。block作用域内未使用任何局部变量,可使用全局变量和静态变量。
__NSStackBlock__:栈block,存放在内存区域中的栈区,当一个作用域结束后,与之相关的栈中的数据都会以被清理,因此超出了其所在的作用域就会被回收。
__NSMallocBlock: 堆block,堆中的block与OC对象一样,内存释放会受到引用计数的管理。MRC:当对一个栈block进行copy时,就会创建出堆block。ARC:block传入局部变量或属性后,系统会帮助我们自动copy,成为堆block。
ARC全局block.png
二、MRC: block作用域只使用了局部变量,则该block为栈block。在ARC:block作用域只使用了局部变量,则该block为堆block。
ARC只使用局部变量时.png
三、变量捕获
1.block使用了全局变量或者静态变量,会直接对其进行访问,并不会做其他额外的操作,在block作用域内,可以对全局变量和静态变量进行修改。
2.block使用了局部变量(自动变量),则block会对其进行拷贝,如果所使用的变量是值类型的,则会直接拷贝值,如果所使用的变量是引用类型 的,则会拷贝引用。
3.可以使用__block 修饰局部变量,然后block作用域可以修改该局部变量。也可以使用指针,直接修改局部变量。
block访问和修改指针局部变量.png
网友评论