美文网首页
block如何修改局部变量

block如何修改局部变量

作者: 寂寞先森666 | 来源:发表于2019-04-28 11:22 被阅读0次

Block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。

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

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

block也属于“函数”的范畴,变量进入block,实际就是已经改变了作用域

****************************************************************************

之前学习block的时候告诉我们在其内部是不能修改外部局部变量的值,如果非要修改就要在变量前面加__block,于是我们就一直这么做了,但为什么加上修饰就可以了呢,这个问题今天我决定好好研究一下。

首先看一下Block的分类

NSGlobalBlock:全局block,只要内部没使用外部变量就是全局block。

NSStackBlock和NSMallocBlock:当内部使用外部变量就会变成栈block,当将block从栈去拷贝到堆区就是变成堆block。

首先看一段代码

int a = 0;

1    NSLog(@"a --%p",&a);

void (^test)(void) = ^{

2    NSLog(@"a --%p",&a);

};

3    NSLog(@"a --%p",&a);

test();

代码的输出顺讯为1-3-2,输出结果

2017-10-16 09:49:23.171 fsafdafasf[3674:471719] a --0x7fff4ff9aa2c

2017-10-16 09:49:23.171 fsafdafasf[3674:471719] a --0x7fff4ff9aa2c

2017-10-16 09:49:23.172 fsafdafasf[3674:471719] a --0x600000051cc0

从输出结果可以看出block内和block外是两个作用域,内部的指针a和外部的指针a虽然名字一样但他们的内存地址已经不同了,这也就是我们可以内部修改局部变量的原因。在block内部会将局部变量的指正复制一份,这样内部和外部就不是一个指针了,就算你重新给内部指针赋值,也无法改变外部指针的指向,他们只是名字相同。

接下来再看一段代码

__block int a = 0;

NSLog(@"a --%p",&a);

void (^test)(void) = ^{

NSLog(@"a --%p",&a);

};

NSLog(@"a --%p",&a);

test();

输出结果  1-3-2

2017-10-16 09:58:15.551 fsafdafasf[3711:476037] a --0x7fff5de71a28

2017-10-16 09:58:15.552 fsafdafasf[3711:476037] a --0x6000000283d8

2017-10-16 09:58:15.552 fsafdafasf[3711:476037] a --0x6000000283d8

结论

没有通过__block修饰则是将值传进去,而通过__block修饰之后是将变量的内存地址传进去,这样就可以修改变量的值。

相关文章

  • __block和__weak区别

    1.Block可以访问局部变量,但是不能修改 如果修改局部变量,需要加__block __block int a ...

  • iOS __block,__weak,__strong 的理解

    __block 在 block 里面可以访问局部变量,但是不能修改局部变量,这是因为当局部变量在 block 中使...

  • iOS中的Block访问变量使用注意问题

    一、Block内访问局部变量 a、在声明block后,调用block之前对局部变量修改,block里面扑获的值仍是...

  • __block的使用

    在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之前的旧值 在局部变...

  • Block

    Block内的变量: 一:局部变量 声明block之后,调用blcok之前,对局部变量进行修改,在调用block时...

  • iOS开发关于block和局部变量和全局变量

    block与局部变量 用__block修饰了局部变量之后,在block内部和外部都可以对局部变量进行修改。 如果不...

  • 局部变量 <> 全局 , static 局部变量,

    局部变量 copy 以后的修改不会改变block 因为是copy static 局部变量, __block N...

  • iOS-block全局变量和局部变量的引用

    1、全局变量,block可以进行读取和修改。 2、局部变量,block只能读取,不能修改局部变量。这个时候是值传递...

  • Block(二)__block

    一、__block修饰基本数据类型的局部变量 1、被__block修饰的局部变量可以在Block内部修改,__bl...

  • __weak 与 __block 的区别

    Blocks理解: Blocks可以访问局部变量,但是不能修改 如果修改局部变量,需要加__block __blo...

网友评论

      本文标题:block如何修改局部变量

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