前言
首发地址:block底层实现与变量捕获
带着问题阅读
- block的本质是什么?你能讲出来它的底层结构吗?
- 全局变量会被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的底层是结构体,