1.变量捕获
变量类型 | 捕获到block内部 | 访问方式 | |
---|---|---|---|
局部变量 | auto | √ | 值传递 |
static | √ | 指针传递 | |
全局变量 | × | 直接访问 |
2.结构
内存分布
block类型 | 环境 |
---|---|
NSGlobalBlock | 没有访问auto变量 |
NSStackBlock | 访问了auto变量 |
NSMallocBlock | NSStackBlock调用了copy |
3.结论
在ARC环境下,编译器会根据情况自动将栈**上的block复制到堆上,比如以下情况**
- block作为函数返回值时
- 将block赋值给__strong指针时
- block作为Cocoa API中方法名含有usingBlock的方法参数时
- block作为GCD API的方法参数时