美文网首页
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