依照基本數(shù)據(jù)類型,類推對象類型.[iOS Block Part2]內(nèi)已經(jīng)將基本數(shù)據(jù)類型的block編譯后的結(jié)構(gòu)體樣式+調(diào)用流程展示過了.本篇文章對于這些內(nèi)容就不再贅述.本篇文章會對對象類型block與基本數(shù)據(jù)類型block的不同點進(jìn)行詳細(xì)講述.
對象類型
int main(int argc, const char * argv[]) {
NSString * any = [NSString stringWithFormat:@"1"];
void (^test)() = ^ {
NSLog(@"%@",any);
};
test();
return 0;
}
編譯結(jié)果:
代碼連線圖還是很復(fù)雜,看結(jié)構(gòu)示意圖:
block(int)
struct __main_block_impl_0 {
struct __block_impl impl;//block方法實現(xiàn)
struct __main_block_desc_0* Desc;//block的描述
int any;//block捕獲了外部變量
};
block(NSString)
struct __main_block_impl_0 {
struct __block_impl impl;//block方法實現(xiàn)
struct __main_block_desc_0* Desc;//block的描述
NSString * any;//block捕獲了外部變量
};
對比起來看,對象類型編譯后的struct __main_block_impl_0
與基本數(shù)據(jù)類型編譯后的struct __main_block_impl_0
并沒有太多的差別.(除了捕獲了外部變量int any
VSNSString * any
).
再看看,兩方的struct __main_block_desc_0
.
block(int)
struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
}
block(NSString)
struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
void (*copy)(struct __main_block_impl_0*, struct __main_block_impl_0*);//多出來的
void (*dispose)(struct __main_block_impl_0*);//多出來的
}
對象類型編譯后的struct __main_block_desc_0
與基本數(shù)據(jù)類型編譯后的struct __main_block_desc_0
相比多出兩個函數(shù)指針.
那么這兩函數(shù)指針分別指向下面兩個函數(shù):
static void __main_block_copy_0(struct __main_block_impl_0*dst, struct __main_block_impl_0*src) {
_Block_object_assign((void*)&dst->any, (void*)src->any, 3/*BLOCK_FIELD_IS_OBJECT*/);
}
static void __main_block_dispose_0(struct __main_block_impl_0*src) {
_Block_object_dispose((void*)src->any, 3/*BLOCK_FIELD_IS_OBJECT*/);
}
那么這兩函數(shù)又拿來做什么的呢?
注意圖片block(NSString)_map
的step1
==>將NSStackBlock
類型的block
進(jìn)行自動copy轉(zhuǎn)換成NSMallocBlock
類型的block
,多了一步NSString * any
的拷貝.
函數(shù)__main_block_copy_0
就是將棧上的NSString * any
拷貝到堆上的.
函數(shù)__main_block_dispose_0
就是將堆NSString * any
銷毀掉的.
iOS Block Part2中已經(jīng)說過
NSStackBlock
類型的block
copy轉(zhuǎn)換成NSMallocBlock
類型的block
的過程后面的文章會詳細(xì)的說,而這里又出個對象的copy,還是那句話:"后面的文章會詳細(xì)的說".
參考文獻(xiàn):
Block技巧與底層解析 by tripleCC