美文网首页
在block内如何修改block外部变量引发的思考

在block内如何修改block外部变量引发的思考

作者: 波妞和酱豆子 | 来源:发表于2018-03-08 11:21 被阅读28次

    默认情况下,在block中访问的外部变量是复制过去的,即:写操作不对原变量生效。但是你可以加上__block

    __block int a = 0;
     void (^foo)(void) = ^{
         a = 1;
     };
     foo(); //这里,a的值被修改为1
    

    Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。

    为什么从栈到堆就可以修改了呢?

    block默认的是NSGlobalBlock类似于函数,存放在代码段;当block内部使用了外部的变量时,block的存放位置变成了NSMallockBlock(堆),所以用__block修饰后才可以在block内部直接修改该变量

    Block其实包含两个部分内容

    • Block执行的代码,这是在编译的时候已经生成好的;
    • 一个包含Block执行时需要的所有外部变量值的数据结构。 Block将使用到的、作用域附近到的变量的值建立一份快照拷贝到栈上。

    Block与函数另一个不同是,Block类似ObjC的对象,可以使用自动释放池管理内存

    Block的类型与内存管理

    根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。

    • NSGlobalBlock:类似函数,位于text段;
    • NSStackBlock:位于栈内存,函数返回后Block将无效;
    • NSMallocBlock:位于堆内存。

    相关文章

      网友评论

          本文标题:在block内如何修改block外部变量引发的思考

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