Block是将函数及其执行上下文封装起来的对象。
Block截获变量
对于基本数据类型的局部变量截获的是其值
对于对象类型的局部变量连同所有权修饰符一起截获(强引用)
以指针形式结果局部静态变量
不截获全局变量、全局静态变量
Block本质上是一个结构体,也有自己的isa
__block将修饰的变量变成了一个对象
a = 20 -> (a.__forwarding->a) = 20
本质
栈上的block
堆上的block(经过copy处理)
都有.__forwarding指针
栈上的__forwarding指向自己(变量)
经过copy后,栈上的.__forwarding指针指向了堆上的__block变量
.__forwarding存在的意义
不论任何内存位置都可以顺利访问统一个__block变量
Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。
block类型:全局类型、栈类型、堆类型
栈上的block进行copy在MRC上会不会存在内存泄漏
block循环引用
__weak所有权修饰变量,是联通属性关键字拷贝的
__block 修改变量
__block自动变量的值,被copy进了Block,不带__block的自动变量只能在里面被访问
在MRC环境下,__block根本不会对指针所指向的对象执行copy操作,而只是把指针进行的复制。
而在ARC环境下,对于声明为__block的外部对象,在block内部会进行retain,以至于在block环境内能安全的引用外部对象。
__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。
为什么会产生循环引用
怎么理解block截获变量的特性
ARC环境下,一旦Block赋值就会触发copy,__block就会copy到堆上,Block也是__NSMallocBlock。ARC环境下也是存在__NSStackBlock的时候,这种情况下,__block就在栈上。