1.变量捕获

变量类型 捕获到block内部 访问方式
局部变量 auto 值传递
static 指针传递
全局变量 × 直接访问

2.结构

image.png

内存分布

image.png

block类型 环境
NSGlobalBlock 没有访问auto变量
NSStackBlock 访问了auto变量
NSMallocBlock NSStackBlock调用了copy

3.结论

在ARC环境下,编译器会根据情况自动将栈**上的block复制到堆上,比如以下情况**

  • block作为函数返回值时
  • 将block赋值给__strong指针时
  • block作为Cocoa API中方法名含有usingBlock的方法参数时
  • block作为GCD API的方法参数时

image.png

__block修饰符

编译器将变量包装成一个对象
image.png

forwarding

主要是可以每时每刻都可以准确访问到被复制到堆区的地址
image.png

强引用问题

image.png