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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容