美文网首页
Block与外部变量

Block与外部变量

作者: 一个半吊子工程师 | 来源:发表于2020-11-07 22:57 被阅读0次

一、截获自动变量(局部变量)值

默认情况

对于block 外的变量引用,block默认是将其复制到自身的数据结构中来实现访问的;
也就是说,block的自动变量截获只针对block内部使用的自动变量,不使用则不截获;
截获的自动变量会存储于block的结构体内部,这会导致block的体积变大
特别要注意的是默认情况下block只能访问不能修改局部变量的值

    int age = 10;
    void (^block)(void) = ^{
        NSLog(@"age = %d",age);
    };
    age = 18;
    block();
输出结果

__block修饰的外部变量

对于用__block 修饰的外部变量引用,block是 复制其引用地址来实现访问的;
block可以修改__block修饰的外部变量的值

image.png
__block int age = 10;
        void (^block)(void) = ^{
            NSLog(@"age = %d",age);
        };
        age = 18;
        block();
输出结果

为什么使用__block修饰的外部变量的值就可以被block修改呢?
我们使用clang 将 OC代码转换为C++文件:

// cd 文件路径
clang -rewrite-objc 源代码的文件名
image.png
会发现一个局部变量加上__block修饰符后将会和block一样变成一个__Block_byref_age_0结构体类型的自动变量实例;
我们在block内部访问age变量则需要通过一个叫__forwarding的成员变量来间接访问age变量
(age.__forwarding->age) = 18;

相关文章

  • Block与外部变量

    一、截获自动变量(局部变量)值 默认情况 对于block 外的变量引用,block默认是将其复制到自身的数据结构中...

  • block

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

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

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

  • Block

    Block Block 可以捕获外部变量 Block 可以捕获来自外部作用域的变量,这是Block一个很强大的特性...

  • Block 之 变量捕获

    为了保证block内部能够正常访问外部的变量,block有个变量捕获机制,即捕获外部变量。 前言: 搞清成员变量、...

  • iOS-block的演示

    会如何定义一个block blcok变量的初始化 简化block的定义 会在block内部访问与修改外部变量 会将...

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

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

  • block浅谈

    block内部不能直接修改外部变量,因为block内部访问外部变量的时候,是以const的方式进行拷贝到block...

  • 使用Block需注意的问题

    1、block中引用外部变量block中引用外部变量时,通常会把对象当做常量变量编码到block中,并且在bloc...

  • OC基础-Block(2)

    OC基础-Block(2)Block的变量捕获为了保证block内部能够正常访问外部的变量,block有个变量捕获...

网友评论

      本文标题:Block与外部变量

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