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依旧存在。