Block

一.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的类型



你可能感兴趣的:(Block)