Block 内存

block的copy

block的三种类型:
NSConcreteStackBlock 存储于栈,copy时复制一份存储于堆。
NSConcreteMallocBlock 存储于堆,copy时无操作
NSConcreteGlobalBlock 存储于已初始化区,copy时无操作

__block变量的__forwarding

clang -rewrite-objc main.m后,发现__block修饰的局部变量被封装成了__Block_byref_XXX_0 结构体。
__isa成员变量指向Block的类型,__forwarding指向什么呢?

//XXX为__block修饰的变量的变量名
struct __Block_byref_XXX_0 {
  void *__isa;
__Block_byref_num_0 *__forwarding;
 int __flags;
 int __size;
 int num;
};

未copy之前,Block,__Block变量都位于栈,__forwarding指向 __Block变量自身。
copy之后,Block,__Block变量都复制到堆,栈区__forwarding指向堆__Block变量,堆__forwarding也指向堆__Block变量。
随着作用域结束,栈上的Block,__Block变量都会释放。堆上的Block,__Block依旧存在。

你可能感兴趣的:(Block 内存)