iOS 開(kāi)發(fā)_深入淺出的剖析Block一、Block分類(lèi)

【作者前言】: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);
    });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容