block 对变量的引用:
- 局部变量,传递的是值,因为局部变量可能在 block 执行之前就被销毁,所以传递的是值
- 局部静态变量,传递的是指针
- 全局静态变量,全局变量,不需要传递,因为在全局区,所以在哪里都可以访问的到
- __block 变量,传递的是结构体指针,__block可以修饰局部变量
- 属性和实例变量,传递的是 self
存储位置
在 ARC 下只访问局部变量的 block 会放在栈上,但是 ARC会在以下情况下自动 copy 到堆上
1、block 作为函数返回值时
2、block 用 strong 修饰时,ARC 对象默认修饰符为 strong
3、block作为Cocoa API中方法名含有usingBlock的方法参数时
4、作为GCD API的方法参数时
要点
没有访问局部变量的 block 会放在全局区
不能把堆上的 block 拷贝到栈上,可以把堆上的 block 移至 全局区
引用全局变量、全局静态变量、局部静态变量:Block 在全局区,属于 GlobalBlock
引用普通外部变量,用 copy,strong 修饰的 Block 就存放在堆区,属于 MallocBlock;用 weak 修饰的Block 存放在栈区,属于 StackBlock
block 块引用对象时,copy函数会将person地址传入_Block_object_assign函数,_Block_object_assign中对Person对象进行强引用或者弱引用
无论如何block内部中对__block修饰变量生成的结构体都是强引用,结构体内部对外部变量的引用取决于传入block内部的变量是强引用还是弱引用
http://www.cocoachina.com/ios/20180628/23965.html
http://www.cocoachina.com/ios/20180628/23968.html