开发者社区> 问答> 正文

一个int变量被 __block 修饰与否的区别?block的变量截获?

一个int变量被 __block 修饰与否的区别?block的变量截获?

展开
收起
montos 2020-04-13 20:53:51 1452 0
1 条回答
写回答
取消 提交回答
  • 没有被__block修饰的int,block体中对这个变量的引用是值拷贝,在block中是不能被修改的。

    通过__block修饰的int,block体中对这个变量的引用是指针拷贝,它会生成一个结构体,复制这个变量的指针引用,从而达到可以修改变量的作用。

    关于block的变量截获:

    block会将block体内引用外部变量的变量进行拷贝,将其拷贝到block的数据结构中,从而可以在block体内访问或修改外部变量。

    外部变量未被__block修饰时,block数据结构中捕获的是外部变量的值,通过__block修饰时,则捕获的是对外部变量的指针引用。

    注意:block内部访问全局变量时,全局变量不会被捕获到block数据结构中。

    举个栗子:

    未被__block修饰的情况

    int param = 1;
    int a = param; // 没用__block修饰的时候,block内部捕获的外部变量
    [self updateInt:a];
    NSLog(@"----:%@", @(param));// 这里输出:1
    
    // 没用__block修饰的时候,block内部实现如下
    - (void)updateInt:(int)a{
        a = 2;// 此时对外部变量修改是无效的
    }
    

    被__block修饰的情况

    int param = 1;
    int *a = &param; // 用__block修饰的时候,block内部捕获的外部变量,是外部变量的指针
    [self updateInt:a];
    NSLog(@"----:%@", @(param));// 这里输出:2
    
    
    // 用__block修饰的时候,block内部实现如下
    - (void)updateInt:(int *)a{
        *a = 2;// 此时对外部变量修改是有效的
    }
    

    参考这篇文章

    2020-04-13 20:54:04
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载