Block本质

^{
    NSLog(@"this is a block!");
};

block不调用是不会执行的
如何调用block,直接添加()就可以调用了即

^{
    NSLog(@"this is a block!");
}();

一般我们都会吧block存起来

void返回值block名称,(void)参数为空
 void(^block)(void) = ^{
  NSLog(@"this is a block!");
}

block();// 调用

这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
所以block底层就是OC对象
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
拿FuncPtr调用这个函数,block的Function就是4句NSLog
这里写图片描述

这里写图片描述
重新整理
这里写图片描述
这里写图片描述
生成main.cpp
这里写图片描述
使main.cpp不参与编译
这里写图片描述
这里写图片描述
本质
这里写图片描述
执行block代码
这里写图片描述

     void(^mhfBlock)(void) = ^{
            NSLog(@"Hello,grit");
        };
        mhfBlock();
    }

针对于这个block,首先会将

       ^{
          NSLog(@"Hello,grit");
       };

这一段代码封装到static void __main_block_func_0(struct __main_block_impl_0 *__cself)函数中
接着为这个mhfBlock生成一种数据结构

struct __main_block_impl_0 {
    struct __block_impl impl;
    struct __main_block_desc_0* Desc;
    __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
        impl.isa = &_NSConcreteStackBlock;
        impl.Flags = flags;
        impl.FuncPtr = fp;
        Desc = desc;
    }
};

再调用结构体的构造函数创建结构体对象,并且吧结构体的地址赋值给mhfBlock这个变量,所以最终block变量就指向了我们这个结构体.
顺便吧函数地址和描述信息给结构体本身成员赋值
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012581760/article/details/81208517