【作者前言】:13年入圈,分享些本人工作中遇到的點(diǎn)點(diǎn)滴滴那些事兒,17年剛開(kāi)始寫(xiě)博客,高手勿噴!以分享交流為主,歡迎各路豪杰點(diǎn)評(píng)改進(jìn)!
1.應(yīng)用場(chǎng)景:
Block經(jīng)常被應(yīng)用于設(shè)計(jì)模式,界面?zhèn)髦担a塊綁定,增強(qiáng)項(xiàng)目靈活性,提升代碼B格等
2.實(shí)現(xiàn)目標(biāo):
理解Block的類(lèi)型有哪幾種?
3.代碼說(shuō)明:
1)Block的分類(lèi)
①全局Block _ _NSGlobalBlock_ _ :沒(méi)有引入任何外部變量
//聲明一個(gè)全局Block代碼塊
void (^block)(void) = ^{
NSLog(@"全局Blcok---");
};
block();///> 隨時(shí)調(diào)用,增強(qiáng)項(xiàng)目靈活性
/** Block本身也是一個(gè)對(duì)象,源碼中具有isa指針
-源碼中:
struct Block_basic {
void *isa;
int Block_flags; // int32_t
int Block_size; // XXX should be packed into Block_flags
void (*Block_invoke)(void *);
void (*Block_copy)(void *dst, void *src); // iff BLOCK_HAS_COPY_DISPOSE
void (*Block_dispose)(void *); //iff BLOCK_HAS_COPY_DISPOSE
//long parms[0]; // where const imports, __block storage references, etc. get laid down
};
*/
NSLog(@"%@",block);
②堆Block _ _NSMallocBlock_ _ : 為何會(huì)成為堆Block? 變量本身在棧中,因?yàn)锽lock具備自動(dòng)捕捉變量的特性,為了訪問(wèn)到變量,會(huì)將變量由 堆 ------> 棧
//聲明一個(gè)堆Block代碼塊
int a = 100;
/**
為何是堆Block? 變量本身在棧中,因?yàn)锽lock具備自動(dòng)捕捉變量的特性,為了訪問(wèn)到變量,會(huì)將變量由 堆 ------> 棧
*/
void (^block)(void) = ^{
NSLog(@"堆Block----%d",a);
};
block();
NSLog(@"%@",block);
③棧Block _ _NSStackBlock_ _ : 沒(méi)有太大實(shí)際意義,基本沒(méi)有實(shí)用。 // copy值到堆區(qū)
NSLog(@"%@",^{
NSLog(@"棧Block ---%d",a);
});