https://www.jianshu.com/p/4e79e9a0dd82?ivk_sa=1025922x
Q:各类型的block在内存中如何分配的?
__NSGlobalBlock __ 在数据区
__NSMallocBlock __ 在堆区
__NSStackBlock __ 在栈区
堆:动态分配内存,需要程序员自己申请,程序员自己管理
栈:自动分配内存,自动销毁,先入后出,栈上的内容存在自动销毁的情况

代码展示block的三种类型:
int age =1;
void(^block1)(void) = ^{
NSLog(@"block1");
};
void(^block2)(void) = ^{
NSLog(@"block2:%d",age);
};
NSLog(@"%@/%@/%@",[block1class],[block2class],[^{
NSLog(@"block3:%d",age);
}class]);
输出结果:
__NSGlobalBlock __/__NSMallocBlock __/__NSStackBlock __
总结
如果block没有捕获自动变量,那么就是__NSGlobalBlock__类型;
没有访问auto变量的block是__NSGlobalBlock __ ,放在数据段
如果block捕获了自动变量,且此block没有执行过copy操作,那么就是__NSStackBlock__类型;
访问了auto变量的block是__NSStackBlock __;
如果__NSStackBlock__类型的block执行过copy操作,那么就是__NSMallocBlock__类型。
[__NSStackBlock __ copy]操作就变成了__NSMallocBlock __;
网友评论