Block

作者: 凶猛老鹰 | 来源:发表于2021-05-30 17:53 被阅读0次

一.block本质上也是一个OC对象,它内部也有个isa指针

block是封装了函数调用以及函数调用环境的OC对象

为了保证block内部能够正常访问外部的变量,block有个变量捕获机制

auto: 这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。

static: 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

通过编译后的代码可以验证

int c=12;

static int d = 13;

struct __main_block_impl_0 {

  struct __block_impl impl;

  struct __main_block_desc_0* Desc;

  inta;

  int*b;

  __main_block_impl_0(void*fp,struct__main_block_desc_0 *desc,int_a,int*_b,intflags=0) : a(_a), b(_b) {

    impl.isa = &_NSConcreteStackBlock;

    impl.Flags = flags;

    impl.FuncPtr = fp;

    Desc = desc;

  }

};

staticvoid__main_block_func_0(struct__main_block_impl_0 *__cself) {

  inta = __cself->a;// bound by copy

  int*b = __cself->b;// bound by copy

            NSLog((NSString *)&__NSConstantStringImpl__var_folders_tn_tyzyh17s5kn7yppk11jsw6t40000gn_T_main_2bce02_mi_0,a);

            NSLog((NSString *)&__NSConstantStringImpl__var_folders_tn_tyzyh17s5kn7yppk11jsw6t40000gn_T_main_2bce02_mi_1,(*b));

            NSLog((NSString *)&__NSConstantStringImpl__var_folders_tn_tyzyh17s5kn7yppk11jsw6t40000gn_T_main_2bce02_mi_2,c);

            NSLog((NSString *)&__NSConstantStringImpl__var_folders_tn_tyzyh17s5kn7yppk11jsw6t40000gn_T_main_2bce02_mi_3,d);

        }

static struct __main_block_desc_0 {

  size_t reserved;

  size_t Block_size;

}__main_block_desc_0_DATA= {0,sizeof(struct__main_block_impl_0)};

intmain(intargc,constchar* argv[]) {

    /* @autoreleasepool */{ __AtAutoreleasePool __autoreleasepool; 

        autointa =10;

        staticintb =11;

        void(*block)(void) = ((void(*)())&__main_block_impl_0((void*)__main_block_func_0, &__main_block_desc_0_DATA, a, &b));

        a =20;

        b =21;

        c =22;

        d =23;

        ((void(*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);

    }

    return0;

}

一个存储的是 int a

一个存储的是 int *b

调用的时候传的&b

c和d是直接访问

二.block的类型

相关文章

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block的使用

    定义block 返回类型 (^block名称)(参数) = ^(){block内容}; 调用block block...

  • Block 02 - __block

    Block 02 - __block __block 的作用 __block 可以解决 Block 内部无法修改 ...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS Block

    Block的分类 Block有三种类型:全局Block,堆区Block,栈区Block 全局Block 当Bloc...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • iOS开发block是用copy修饰还是strong

    Block分为全局Block、堆Block和栈Block1、在定义block没有引用外部变量的时候,block为全...

  • block 初探

    全局block, 栈block, 堆block

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

网友评论

      本文标题:Block

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