美文网首页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内部就可以对外部的变量进行修改

相关文章

  • iOS总结面试题答案

    1.__block修饰的变量为什么能在block里面能改变其值? Block不允许修改外部变量的值,这里所说的外部...

  • Block原理

    为什么不允许block修改外部变量 Block不允许修改外部变量的值Apple这样设计,应该是考虑到了block的...

  • iOS底层原理 - block如何修改外部变量

    在block里面需要修改外部变量时,我们会使用__block修饰这个外部变量,然后再对其进行修改操作,这是为什么呢...

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

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

  • iOS面试题(31.Block的循环引用、内部修改外部变量、三种

    block强引用self,self强引用block内部修改外部变量:block不允许修改外部变量的值,这里的外部变...

  • block的变量以及内存管理

    有些疑问 1.为什么在block里面改变获取的外部变量的值编译会报错?2.在block里面改变任何获取的外部变量的...

  • block

    block block内部访问外部的变量 如果外部的变量是基本数据类型,在block内部不可以直接修改外部变量的值...

  • 有关iOS面试问题总结

    1、block可以修改外部变量吗? 在block内如何修改block外部变量引发的思考:为什么直接就可以修改全局变...

  • 关于 __ block 再理解

    关于 __ block 再理解 我们都知道:block不准修改外部变量的值,这里所说的外部变量的值,指的是栈中指针...

  • __block关键字

    前提:Objective-C规定,在block中不能修改外部变量的值,若想修改则需在变量前边加__block关键字...

网友评论

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

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