Block本质
block本质上也是一个OC对象,它内部也有个isa指针,在__block_impl结构体中;
block是封装了函数调用以及函数调用环境的OC对象;
block的底层结构如下:
//block的底层实现就是__main_block_impl_0结构体
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__Block_byref_age_0 *age; // by ref
};
struct __block_impl {
void *isa;//OC对象标志性指针
int Flags;
int Reserved;
void *FuncPtr;//block执行的代码地址
};
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
//下面两个捕获非Object对象不会生成,用来内存管理
void (*copy)(struct __main_block_impl_0*, struct __main_block_impl_0*);//实现强弱引用
void (*dispose)(struct __main_block_impl_0*);//release操作
};
struct __Block_byref_age_0 {
void *__isa;
__Block_byref_age_0 *__forwarding;
int __flags;
int __size;
int age;
};
Block的变量捕获
变量捕获
Block类型
1.block有3种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是继承自NSBlock类型
- NSGlobalBlock ( _NSConcreteGlobalBlock )
- NSStackBlock ( _NSConcreteStackBlock )
-
NSMallocBlock ( _NSConcreteMallocBlock )
2.block类型转换
block捕获变量.png -
block调用copy
block调用copy