iOS开发——block底层实现与变量捕获

本文探讨了iOS开发中的Block,包括其底层数据结构和变量捕获机制。Block本质上是一个结构体,包含了执行代码的函数地址和捕获的外部变量。在变量捕获中,Block会捕获auto自动变量的值,静态变量的指针,但不捕获全局变量。对于self的捕获,会涉及Block的循环引用问题。
摘要由CSDN通过智能技术生成

前言

首发地址:block底层实现与变量捕获

带着问题阅读

  1. block的本质是什么?你能讲出来它的底层结构吗?
  2. 全局变量会被block捕获吗?block会捕获哪些变量?

block的底层数据结构

block又叫代码块,是OC语法中非常重要的一个概念,我们先来看一下Block的简单使用。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        ^{
            NSLog(@"hello block");
        }();

        int d = 5;
        void (^block)(int, int) = ^(int a, int b) {
            int c = a + b + d;
            NSLog(@"a + b + d = %d", c);
        };
        block(3, 4);
    }
    return 0;
}
复制代码

上面的代码中,我们创建了两个Block,一个直接执行,输出Hello World。 一个通过block变量进行调用,并引用了一个外部变量d。输出12

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

推荐阅读
iOS开发——最新 BAT面试题合集(持续更新中)

我们将以上代码编译成C代码:

# 在main.m所在目录执行该命令。
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp
复制代码

从main-arm64.cpp文件中,我们可以看到Block的结构如下:

struct __main_block_impl_1 {
  struct __block_impl impl;
  struct __main_block_desc_1* Desc;
  int d;
  __main_block_impl_1(void *fp, struct __main_block_desc_1 *desc, int _d, int flags=0) : d(_d) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

struct __block_impl {
  void *isa;
  int Flags;
  int Reserved;
  void *FuncPtr;
};
复制代码

我们可以看出Block的底层是结构体,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值