block本质是一个对象,底层用struct实现。
数据结构如下:
struct Block_descriptor {
unsigned long int reserved;
unsigned long int size;
void (*copy)(void *dst, void src);
void (dispose)(void *);
};
struct Block_layout {
void isa;
int flags;
int reserved;
void (invoke)(void *, ...);
struct Block_descriptor descriptor;
/ Imported variables. */
};
- isa指针,所有对象都有该地址,用于实现对象相关的功能。
- flags, 用于按 bit 位表示一些 block 的附加信息,block copy 的实现代码可以看到对该变量的使用
- reserved,保留变量
- invoke,函数指针,指向具体的block实现的函数调用地址
- descriptor,表示该bolck的附加描述信息,主要是 size 大小,以及 copy 和 dispose 函数的指针
- variables,capture 过来的变量,block 能够访问它外部的局部变量,就是因为将这些变量(或变量的地址)复制到了结构体中。
__block作用:可以获取对应变量的指针,使其可以在block内部被修改。
__block数据结构
struct __Block_byref_i_0 {
void *__isa;
__Block_byref_i_0 *__forwarding;
int __flags;
int __size;
int val; //变量名
};
网友评论