// 全局变量
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);
}