block为什么要冲从栈区拷贝到堆区
2020-11-08 本文已影响0人
一个半吊子工程师
ARC下,访问外界变量的block为什么要冲从栈区拷贝到堆区?
栈上的block,如果其所属的变量作用域结束,那么block就会被废弃,如同一般的自动变量;
当然,block中的__block变量也同时被废弃,如下:
栈区block
为了解决栈块在其变量作用域结束之后被释放废弃的问题,我们需要把block复制到堆区,以延长其生命周期。
在ARC下编译器会进行判断,判断是否有需要将block从栈复制到堆,如果有就自动生成将block从栈复制到堆的代码。
block复制操作执行的是copy实例方法
,block只要调用copy方法,栈块就会变成堆块。
如下图:
例如下面一个返回值为block类型的函数:
typedef int (^blk_t)(int);
blk_t func(int rate){
return ^(int count){
return rate * count;
};
}
分析:
函数返回的block是配置在栈上的,所以返回函数调用时,block变量作用域就结束了,block也被释放废弃。但在ARC,这种情况编译器会自动完成复制。
在非ARC情况下则需要开发者手动调用copy方法
复制;