美文网首页iOS
为什么在__block里面能修改外部变量的值?

为什么在__block里面能修改外部变量的值?

作者: 黎先生_ | 来源:发表于2019-02-25 14:02 被阅读33次

    我们在使用block修改外部变量的值的时候如果不加__修饰的话会报错通常我们使用__block修饰。

    例如:

    __block int a = 10;
        void(^changeA)(void) = ^ {
            a = 20;
        };
    
    changeA();
    NSLog(@"%d",a);
    

    很多的时候我们就是这样写,但是为什么呢?

    在内存中存在以下分区:

    栈:用于存放临时变量,处理速度快,但是因为栈的内存极小,容易产生内存泄漏。
    堆:空间大,处理速度一般。
    只读数据段:用于存放常量(字面常量,符号常量),不能被修改。
    数据段:全部变量
    代码段:代码、函数名称。

    通过上面的分区我们可以知道,变量声明出来存放到栈上面,而block,默认存放到
    NSGlobalBlock 全局的block,NSGlobalBlock类似于函数,存放在代码段。
    当block使用了外部的变量时,block存放的位置变成了NSMallockBlock(堆)
    _block 修饰以后,会类似于桥接,将被修饰的变量被block所持有,此时该变量也转存到堆空间,所以此时Block内部就可以对外部的变量进行修改

    相关文章

      网友评论

        本文标题:为什么在__block里面能修改外部变量的值?

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