block

150 阅读2分钟

block 底层

block是一个封装了函数和函数运行环境的对象.

struct __block_impl {
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;//函数地址
};
static struct __main_block_desc_0 {
  size_t reserved;
  size_t Block_size;
};
///方法生成,并传给 impl的 FuncPtr
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
  int a = __cself->a; // bound by copy

            NSLog((NSString *)&__NSConstantStringImpl__var_folders_cc_qfkn2v0n33s52g_224cvh7d40000gn_T_main_e95027_mi_0);
            NSLog((NSString *)&__NSConstantStringImpl__var_folders_cc_qfkn2v0n33s52g_224cvh7d40000gn_T_main_e95027_mi_1,a);
}
struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  int a;//捕获的变量
  ///构造方法
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _a, int flags=0) : a(_a) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
int main(int argc, const char * argv[]) {
        int a = 10;
        ///构造方法
       block = &__main_block_impl_0(__main_block_func_0, &__main_block_desc_0_DATA, a));
       ///方法调用
    (block->FuncPtr)(block);
    }
    return 0;
}

block 类型

1:__NSGlobalBlock__ 没有访问auto变量得block
 void(^block1)(void) = ^{
                  NSLog(@"12334 %d",sex);
  };
2:__NSMallocBlock__ 访问了auto变量得block,并进行了copy操作
 ///在mrc 环境下 下面是 __NSStackBlock__
  ///arc 帮助我们进行了copy 所以是 __NSMallocBlock__
  ///在ARC环境下,系统会在以下情况自动对block 进行copy
  ///1:block 作为函数返回值
  ///2:具有强指针指向block得时候
  ///3:foundation中参数带有usingblock及gcd得block
  ///4:属性声明 copy,strong
  int a = 10;
        void(^block)(void) = ^{
            NSLog(@"12334");
            NSLog(@"12334--%d",a);
   };
3:__NSStackBlock__ 栈block
    ///如果block在栈上,那么block内部不会对任何捕捉得对象进行强引用
    ///复制到堆得时候
    ///1:会调用block 内部得copy函数
    ///2:__main_block_desc_1 会生成 copy函数和dispose函数
    ///2:捕捉得对象得引用会根据用户得声明进行操作 ex:__strong,__weak
    /*
    strong对象
    struct __main_block_impl_1 {
        struct __block_impl impl;
        struct __main_block_desc_1* Desc;
        NSObject *weakObj;
        __main_block_impl_1(void *fp, struct __main_block_desc_1 *desc,     NSObject *__weak _weakObj, int flags=0) : weakObj(_weakObj) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
         }
    };
    __weak对象
     struct __main_block_impl_1 {
        struct __block_impl impl;
        struct __main_block_desc_1* Desc;
        NSObject *__weak weakObj;
        __main_block_impl_1(void *fp, struct __main_block_desc_1 *desc,     NSObject *__weak _weakObj, int flags=0) : weakObj(_weakObj) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
         }
    };
    */
    ///移除得时候
    ///1:会调用block内部得dispose函数