美文网首页
在Block中如何修改Block外部变量的值的一点点剖析

在Block中如何修改Block外部变量的值的一点点剖析

作者: JiYis | 来源:发表于2016-08-04 16:45 被阅读1315次

在使用Block的时候,如果尝试去修改外部变量的值,此时是会报警告的

我们最常见的做法就是在需要修改的变量前加上 __block 修饰,例如:

__block int a = 10;
void(^changeA)(void) = ^ {
    a = 20;
};

changeA();
//  执行完之后可以发现a的值变成了20

很多时候,我们都直接这样去操作,但是为什么加上__block之后,就可以这样操作?

在内存中分区大致可分为:

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

通过上面的分区我们可以知道
变量声明出来存放在栈上面
而block,默认存放在NSGlobalBlock 全局的block;我们常常把block和C中的函数做对比,此时也类似,NSGlobalBlock类似于函数,存放在代码段

当block内部使用了外部的变量时,block的存放位置变成了NSMallockBlock(堆)

__block 修饰以后,会类似于桥接,将被修饰的变量被block所持有,此时该变量也转存到堆空间,所以此时Block内部就可以对外部的变量进行修改

(还有NSStatckBlock位于栈内存)

以上只是个人的理解,如果有错误的地方,希望大家指正,感谢!

相关文章

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

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

  • block

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

  • 有关iOS面试问题总结

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

  • iOS中 __block关键字的实现原理

    在block内如何修改block外部变量? 1.默认情况下,在block中访问的外部变量是复制过去的,即:.我们可...

  • __block关键字

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

  • __block关键字

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

  • iOS总结面试题答案

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

  • Block原理

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

  • 为什么Block不能直接修改外部变量的值

    通常在Block中获取到的外部变量只是这个变量的表示,无论在Block中怎么修改都不会改变外部变量的值的。我们在写...

  • block代码块中改变外部变量的值

    block代码块中若想改变外部变量的值需要在外部变量钱面加__block. 需注意如果只是在块内修改了变量,外部没...

网友评论

      本文标题:在Block中如何修改Block外部变量的值的一点点剖析

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