Block的本質(zhì)
block本質(zhì)上也是一個OC對象揭厚,它內(nèi)部也有個isa指針
void (^block)(void) = ^{
NSLog(@"I am a block");
};
block();
以上OC代碼生成的C++代碼為:
//block的定義聲明
void (*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
//block的調(diào)用
((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);
其中的生成的C++結(jié)構(gòu)體分別是:
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
};
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)};
代碼塊生成為函數(shù)
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
NSLog(...);
}
- block最后生成的是結(jié)構(gòu)體__main_block_impl_0夜惭,
- block是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC對象
- 底層結(jié)構(gòu)如下圖所示:
Blcok_Layout | 備注 |
---|---|
(void *) isa | isa指針 |
(int) flags | |
int Reserved | |
void *FuncPtr | 函數(shù)地址 |
struct __main_block_desc_0* Desc | block對象信息 |
__main_block_desc_0 | 備注 |
---|---|
reserved | |
Block_size | block結(jié)構(gòu)體大小 |