【资料整理】
1. block本质
block上也是一个OC对象,它内部也有一个isa指针,它是封装了函数调用以及函数调用环境的OC对象,block的底层调用结构如图所示
block底层结构.png
block1声明
int age = 10;
void(^block1)(void) = ^{
NSLog(@"block2:%d",age);
};
-
block1对应的底层代码
image.png
__main_block_impl_0: 为block1对应的结构体,结构体里面的__main_block_impl_0为构造函数(OC中的init方法),返回结构体本身
__main_block_func_0: 为block1括号内实现
__main_block_desc_0: 存放着block在内存中占用的大小
age : 外部捕获的auto变量,值传递,不可修改
block1声明
__weak NSString *age = @"10";
void(^block1)(void) = ^{
NSLog(@"block2:%@",age);
};
-
block1对应的底层代码
image.png
2. block的类型
block有三种类型,可以通过调用class方法或者isa指针查看具体类型,最终都是继承自NSBlock类型
int age = 10;
void(^block)(void) = ^{
NSLog(@"block ");
};
void(^block1)(void) = ^{
NSLog(@"block2:%d",age);
};
NSLog(@"--- %@",[block class]);
NSLog(@"--- %@", [block1 class]);
NSLog(@"--- %@",[^{
NSLog(@"block3:%d",age);
} class]);
输出结果:
--- NSGlobalBlock //栈区
--- NSMallocBlock // 堆区
--- NSStackBlock //数据段 .data
image.png
3. block的变量捕获
- 为了保证block内部能够正常访问外部变量,block有个变量捕获机制。
block变量捕获机制
注意:正是因为这种捕获机制,对于外部的auto局部变量,则不能直接在block内部直接修改。
image.png
4. __block 修饰符
image.png
__block的内存管理
image.png
__block 中的 __forwarding指针
image.png
被__block 修饰的对象类型
image.png
5.block内服访问: 对象类型的auto变量、__block变量
image.png
block的copy
image.png
block的循环引用问题
image.png














网友评论