Block数据结构定义,如下:
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,表示该block的附加描述信息,主要是size 大小,以及copy和dispose函数指针。
variables,capture过来的变量,block能够访问它外部的局部变量,就是因为将这些变量或其地址复制到了结构体中。