一.block本质上也是一个OC对象,它内部也有个isa指针
block是封装了函数调用以及函数调用环境的OC对象
为了保证block内部能够正常访问外部的变量,block有个变量捕获机制
![](https://img.haomeiwen.com/i1865501/a4db31d350245e6b.png)
auto: 这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。
static: 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
通过编译后的代码可以验证
int c=12;
static int d = 13;
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
inta;
int*b;
__main_block_impl_0(void*fp,struct__main_block_desc_0 *desc,int_a,int*_b,intflags=0) : a(_a), b(_b) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
staticvoid__main_block_func_0(struct__main_block_impl_0 *__cself) {
inta = __cself->a;// bound by copy
int*b = __cself->b;// bound by copy
NSLog((NSString *)&__NSConstantStringImpl__var_folders_tn_tyzyh17s5kn7yppk11jsw6t40000gn_T_main_2bce02_mi_0,a);
NSLog((NSString *)&__NSConstantStringImpl__var_folders_tn_tyzyh17s5kn7yppk11jsw6t40000gn_T_main_2bce02_mi_1,(*b));
NSLog((NSString *)&__NSConstantStringImpl__var_folders_tn_tyzyh17s5kn7yppk11jsw6t40000gn_T_main_2bce02_mi_2,c);
NSLog((NSString *)&__NSConstantStringImpl__var_folders_tn_tyzyh17s5kn7yppk11jsw6t40000gn_T_main_2bce02_mi_3,d);
}
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)};
intmain(intargc,constchar* argv[]) {
/* @autoreleasepool */{ __AtAutoreleasePool __autoreleasepool;
autointa =10;
staticintb =11;
void(*block)(void) = ((void(*)())&__main_block_impl_0((void*)__main_block_func_0, &__main_block_desc_0_DATA, a, &b));
a =20;
b =21;
c =22;
d =23;
((void(*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);
}
return0;
}
一个存储的是 int a
一个存储的是 int *b
调用的时候传的&b
c和d是直接访问
二.block的类型
![](https://img.haomeiwen.com/i1865501/c15a8b2528d60f28.png)
![](https://img.haomeiwen.com/i1865501/11d82d260d677f24.png)
网友评论