Clang看block底层结构

本文详细剖析了Block的底层结构,包括`_block_impl`、`_main_block_desc_0`和`_main_block_impl_0`等结构体,阐述了Block如何捕获外部变量、作为对象的特性以及如何通过`FuncPtr`调用Block。通过LLDB调试和代码示例展示了Block的内存分布和调用过程,揭示了Block的本质是一个OC对象,并探讨了Block与函数指针的关系。
摘要由CSDN通过智能技术生成

前言

Clang分析下block的底层结构

Clang看block

代码

int age = 30;
void (^yang)(void) = ^{
   
    NSLog(@"%d", age);
};
yang();

clang

// 存在isa  说明block是个对象
struct __block_impl {
   
    void *isa;
    int Flags;
    int Reserved;
    void *FuncPtr;
};

struct __main_block_desc_0 {
   
    size_t reserved;
    size_t Block_size;
};

struct __main_block_impl_0 {
   
    struct __block_impl impl;
    struct __main_block_desc_0* Desc;
    int age;
};

struct __main_block_impl_0 {
   
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  // 能捕获外部变量 有函数的效果
  int age;
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _age, int flags=0) : age(_age) {
   
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
   
  int age = __cself->age; // bound by copy

            NSLog((NSString *)&__NSConstantStringImpl__var_folders_zm_558cwfjs099fbm2r8kxg8wt00000gt_T_main_bfedde_mi_0, age);
        }

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)};


int main(int argc, char * argv[]) {
   
    NSString * appDelegateClassName;
    /* @autoreleasepool */ {
    __AtAutoreleasePool __autoreleasepool; 

        int age = 30;
        // 指向一个地址  说明block是个指针
        void (*yang)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, age));
        ((void (*)(__block_impl *))((__block_impl *)yang)->FuncPtr)((__block_impl *)yang);


        appDelegateClassName = NSStringFromClass(((Class (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("AppDelegate"), sel_registerName("class")));
    }
    return UIApplicationMain(argc, argv, _
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值