Block本質(zhì)
block本質(zhì)上也是一個OC對象豁翎,它內(nèi)部也有個isa指針,在__block_impl結(jié)構(gòu)體中;
block是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的OC對象;
block的底層結(jié)構(gòu)如下:
//block的底層實現(xiàn)就是__main_block_impl_0結(jié)構(gòu)體
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__Block_byref_age_0 *age; // by ref
};
struct __block_impl {
void *isa;//OC對象標(biāo)志性指針
int Flags;
int Reserved;
void *FuncPtr;//block執(zhí)行的代碼地址
};
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
//下面兩個捕獲非Object對象不會生成,用來內(nèi)存管理
void (*copy)(struct __main_block_impl_0*, struct __main_block_impl_0*);//實現(xiàn)強(qiáng)弱引用
void (*dispose)(struct __main_block_impl_0*);//release操作
};
struct __Block_byref_age_0 {
void *__isa;
__Block_byref_age_0 *__forwarding;
int __flags;
int __size;
int age;
};
Block的變量捕獲
變量捕獲
Block類型
1.block有3種類型,可以通過調(diào)用class方法或者isa指針查看具體類型茅撞,最終都是繼承自NSBlock類型
- NSGlobalBlock ( _NSConcreteGlobalBlock )
- NSStackBlock ( _NSConcreteStackBlock )
-
NSMallocBlock ( _NSConcreteMallocBlock )
2.block類型轉(zhuǎn)換
block捕獲變量.png -
block調(diào)用copy
block調(diào)用copy