block 底层
block是一个封装了函数和函数运行环境的对象.
struct __block_impl {
void *isa
int Flags
int Reserved
void *FuncPtr
}
static struct __main_block_desc_0 {
size_t reserved
size_t Block_size
}
///方法生成,并传给 impl的 FuncPtr
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
int a = __cself->a
NSLog((NSString *)&__NSConstantStringImpl__var_folders_cc_qfkn2v0n33s52g_224cvh7d40000gn_T_main_e95027_mi_0)
NSLog((NSString *)&__NSConstantStringImpl__var_folders_cc_qfkn2v0n33s52g_224cvh7d40000gn_T_main_e95027_mi_1,a)
}
struct __main_block_impl_0 {
struct __block_impl impl
struct __main_block_desc_0* Desc
int a
///构造方法
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _a, int flags=0) : a(_a) {
impl.isa = &_NSConcreteStackBlock
impl.Flags = flags
impl.FuncPtr = fp
Desc = desc
}
}
int main(int argc, const char * argv[]) {
int a = 10
///构造方法
block = &__main_block_impl_0(__main_block_func_0, &__main_block_desc_0_DATA, a))
///方法调用
(block->FuncPtr)(block)
}
return 0
}
block 类型
1:__NSGlobalBlock__ 没有访问auto变量得block
void(^block1)(void) = ^{
NSLog(@"12334 %d",sex)
}
2:__NSMallocBlock__ 访问了auto变量得block,并进行了copy操作
///在mrc 环境下 下面是 __NSStackBlock__
///arc 帮助我们进行了copy 所以是 __NSMallocBlock__
///在ARC环境下,系统会在以下情况自动对block 进行copy
///1:block 作为函数返回值
///2:具有强指针指向block得时候
///3:foundation中参数带有usingblock及gcd得block
///4:属性声明 copy,strong
int a = 10
void(^block)(void) = ^{
NSLog(@"12334")
NSLog(@"12334--%d",a)
}
3:__NSStackBlock__ 栈block
///如果block在栈上,那么block内部不会对任何捕捉得对象进行强引用
///复制到堆得时候
///1:会调用block 内部得copy函数
///2:__main_block_desc_1 会生成 copy函数和dispose函数
///2:捕捉得对象得引用会根据用户得声明进行操作 ex:__strong,__weak
/*
strong对象
struct __main_block_impl_1 {
struct __block_impl impl
struct __main_block_desc_1* Desc
NSObject *weakObj
__main_block_impl_1(void *fp, struct __main_block_desc_1 *desc, NSObject *__weak _weakObj, int flags=0) : weakObj(_weakObj) {
impl.isa = &_NSConcreteStackBlock
impl.Flags = flags
impl.FuncPtr = fp
Desc = desc
}
}
__weak对象
struct __main_block_impl_1 {
struct __block_impl impl
struct __main_block_desc_1* Desc
NSObject *__weak weakObj
__main_block_impl_1(void *fp, struct __main_block_desc_1 *desc, NSObject *__weak _weakObj, int flags=0) : weakObj(_weakObj) {
impl.isa = &_NSConcreteStackBlock
impl.Flags = flags
impl.FuncPtr = fp
Desc = desc
}
}
*/
///移除得时候
///1:会调用block内部得dispose函数