美文网首页
block为什么要冲从栈区拷贝到堆区

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

作者: 一个半吊子工程师 | 来源:发表于2020-11-08 12:19 被阅读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方法复制;

相关文章

网友评论

      本文标题:block为什么要冲从栈区拷贝到堆区

      本文链接:https://www.haomeiwen.com/subject/fcfhbktx.html