block为什么要冲从栈区拷贝到堆区

2020-11-08  本文已影响0人  一个半吊子工程师

ARC下,访问外界变量的block为什么要冲从栈区拷贝到堆区?

栈上的block,如果其所属的变量作用域结束,那么block就会被废弃,如同一般的自动变量;
当然,block中的__block变量也同时被废弃,如下:


栈区block

为了解决栈块在其变量作用域结束之后被释放废弃的问题,我们需要把block复制到堆区,以延长其生命周期。
在ARC下编译器会进行判断,判断是否有需要将block从栈复制到堆,如果有就自动生成将block从栈复制到堆的代码。
block复制操作执行的是copy实例方法,block只要调用copy方法,栈块就会变成堆块。
如下图:

copy后

例如下面一个返回值为block类型的函数:

typedef int (^blk_t)(int);
blk_t func(int rate){
    return ^(int count){
        return rate * count;
    };
}

分析:
函数返回的block是配置在栈上的,所以返回函数调用时,block变量作用域就结束了,block也被释放废弃。但在ARC,这种情况编译器会自动完成复制。
在非ARC情况下则需要开发者手动调用copy方法复制;

上一篇下一篇

猜你喜欢

热点阅读