获取Block捕获的变量

文章目录

本文理解获取block捕获变量的原理,参考一种查看Block中引用的所有外部对象的实现方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void *isa;
volatile int32_t flags; // contains ref count
int32_t reserved;
void *invoke;
struct Block_descriptor_1 *descriptor;
struct Block_descriptor_2 *descriptor2
struct Block_descriptor_3 *descriptor3
|
|---------signature
|---------layout
| 压缩格式 0x02 3 4 表示有2个强引用、3个__block、4个弱引用对象
strong NSObject * obj1; ------------| | |
strong NSObject * obj2; ------------| | |
| |
__block NSObject * obj3;--------------| |
__block NSObject * obj4;--------------| |
__block NSObject * obj5;--------------| |
|
__weak NSObject * obj6;------------------|
__weak NSObject * obj7;------------------|
__weak NSObject * obj8;------------------|
__weak NSObject * obj9;------------------|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void *isa;
volatile int32_t flags; // contains ref count
int32_t reserved;
void *invoke;
struct Block_descriptor_1 *descriptor;
struct Block_descriptor_2 *descriptor2
struct Block_descriptor_3 *descriptor3
|
|---------signature
|---------layout
| 非压缩格式 0x32 43 54 ... 00
strong NSObject * obj1; ------------| | | 0x324位中3表示强引用类型
strong NSObject * obj2; ------------| | | 低4位中的2表示有2个对象
| |
__block NSObject * obj3;--------------| | 0x434位中4表示__block类型
__block NSObject * obj4;--------------| | 低4位中的3表示有2个对象
__block NSObject * obj5;--------------| |
|
__weak NSObject * obj6;------------------| 0x544位中5表示若引用类型
__weak NSObject * obj7;------------------| 低4位中的4表示有4个对象
__weak NSObject * obj8;------------------|
__weak NSObject * obj9;------------------|