最新 Objective-C Block 捕获原理

// 全局变量
int c = 10;
// 全局静态变量
static int d = 10;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // auto 自动变量 离开作用域自动销毁
        // 局部变量
        auto int a = 10;
        // 静态局部变量
        static int b = 10;
        
        void(^block)(void) = ^{
            NSLog(@"自动变量:%d,静态变量%d",a,b);
            NSLog(@"全局变量:%d,全局静态变量%d",c,d);
        };
        a = 20;
        b = 20;
        c = 20;
        d = 20;
        block();
        // 自动变量:10,静态变量20
        // 全局变量:20,全局静态变量20
        // 结论就是 block 捕获局部变量 不捕获全局变量
        // 如果捕获的是auto变量是值传递 static是指针传递 全局变量直接访问
        
    }
    return 0;
}

结论就是 block 捕获局部变量 不捕获全局变量
如果捕获的是auto变量是值传递 static是指针传递 全局变量直接访问

通过命令行 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m 转成C++代码 (这个不一定百分之百准确)

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-14.0.0 main.m (可以指定版本)

Block 封装了函数调用以及调用环境 本质也OC对象

int c = 10;
static int d = 10;

int main(int argc, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;
        auto int a = 10;
        static int b = 10;
        void(*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, a, &b));
        a = 20;
        b = 20;
        c = 20;
        d = 20;
        ((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);
    }
    return 0;
}

struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  int a;  // 值类型
  int *b; // 指针类型
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _a, int *_b, int flags=0) : a(_a), b(_b) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

struct __block_impl {
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;
};

static struct __main_block_desc_0 {
  size_t reserved;
  size_t Block_size; // block 的大小
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};

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

    NSLog((NSString *)&__NSConstantStringImpl__var_folders_sb_4zrr27qd24j2n8x7yj8bx4v40000gn_T_main_ed950d_mi_0,a,(*b));
    NSLog((NSString *)&__NSConstantStringImpl__var_folders_sb_4zrr27qd24j2n8x7yj8bx4v40000gn_T_main_ed950d_mi_1,c,d);
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值