__block

作者: 有毒的程序猿 | 来源:发表于2019-01-17 09:57 被阅读6次
1.__block
  • 我们知道堆上的block会捕获auto变量的值,会捕获静态变量和全局变量的指针.下面我们来看下被__block修饰的变量产生了那些变化
 __block int age = 10;
 void(^block)(void) = ^{
     NSLog(@"%d",age);
 };
 block();

我们转一下c++

  __attribute__((__blocks__(byref))) __Block_byref_age_0 age = {(void*)0,(__Block_byref_age_0 *)&age, 0, sizeof(__Block_byref_age_0), 10};
        void(*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, (__Block_byref_age_0 *)&age, 570425344));
        ((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);

优化一下,去掉一些强制转换

 __Block_byref_age_0 age = {
0,
&age, 
0,
 sizeof(__Block_byref_age_0), 
10 
};

*block = &__main_block_impl_0(main_block_func_0, &__main_block_desc_0_DATA, &age, 570425344);

block->FuncPtr();

  • 当变量被__block修饰后,会被包装成__Block_byref_age_0的结构体
struct __Block_byref_age_0 {
  void *__isa;
__Block_byref_age_0 *__forwarding;
 int __flags;
 int __size;
 int age;
};

结构体又5个成员,上面就是对结构体赋值

block

struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  __Block_byref_age_0 *age; // by ref   这就是被block修饰的age变量
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_age_0 *_age, int flags=0) : age(_age->__forwarding) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

当访问age变量时其实是拿的__Block_byref_age_0 *age;所以被__block修饰的变量可以在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/bbxvdqtx.html