內(nèi)存管理篇之Blocks

內(nèi)存管理篇之Blocks

Blocks 是 C 語(yǔ)言的擴(kuò)充功能:帶有自動(dòng)變量(局部變量)的匿名函數(shù)

1. Block 類型變量

聲明如下:

int (^block)(int);

block 實(shí)現(xiàn)賦值

    int(^block)(int)  = ^(int num) {
        NSLog(@"%d",num);
        return num + 10;
    };
    
    block(222);

可以按照如下格式定義一個(gè)類型:typedef returnType(^blockName)(parameterType) ;

2. Block 作為函數(shù)參數(shù)

格式1:- type funckName:(returnType(^)(parameterType)) blockName{}

//定義類型
typedef  void(^myblock)(int) ;

//聲明屬性--可以直接把 block 名當(dāng)做一個(gè)類型使用
@property (nonatomic, copy) myblock block;
//block 作為函數(shù)參數(shù)方式一
-(void)blockTest:(void(^) (int))  func{
    func(2);
}
//block 作為函數(shù)參數(shù)方式二
-(void)blockTest2:(myblock )  func{
    func(2);
}

3. Block 截獲局部變量值

block 截獲的是 自動(dòng)變量的瞬間值.也就是說(shuō)在 block 定義之后改變了 自動(dòng)變量值,也不會(huì)影響 block 執(zhí)行時(shí)候的值了

    NSString* str = @"test";
    
    void (^pBlock)(void)  = ^{
         NSLog(@"str = %@",str);
    };
    str = @"test2";
    pBlock();

打印結(jié)果: str = test

4. __block說(shuō)明符

block 因?yàn)榻孬@的只是 變量的瞬間值,因此是不能修改的.如果嘗試修改會(huì)報(bào)編譯錯(cuò)誤. 如果想在 block 中修改外部變量的值,需要在外部使用__ block 說(shuō)明符.

這個(gè)會(huì)報(bào)編譯錯(cuò)誤:

    NSString* str = @"test";
    
    void (^pBlock)(void)  = ^{
         NSLog(@"str = %@",str);
        str = @"change test";
    };

下面的正常:

    __block NSString* str = @"test";
    
    void (^pBlock)(void)  = ^{
         NSLog(@"str = %@",str);
        str = @"change test";
    };

5. 截獲自動(dòng)變量

如果 向 block 中截獲的自動(dòng)變量賦值,就會(huì)產(chǎn)生編譯錯(cuò)誤,基本數(shù)據(jù)類型和 OC 類型都一樣,但是調(diào)用 OC 對(duì)象的方法不會(huì)產(chǎn)生編譯錯(cuò)誤

下面的代碼運(yùn)行正常:

    NSMutableArray *arr = [NSMutableArray array];
    
    void (^pBlock)(void)  = ^{
        
        [arr addObject:@"test"];
    };

    pBlock();

下面的代碼嘗試給 arr賦值,編譯異常:

    NSMutableArray *arr = [NSMutableArray array];
//    __block NSMutableArray *arr = [NSMutableArray array]; //這樣會(huì)沒(méi)有異常

    void (^pBlock)(void)  = ^{
        
         arr = [NSMutableArray array];
    };

    pBlock();

6. 允許 block 改寫截獲的自動(dòng)變量的幾種情況

  • __block說(shuō)明符修飾
  • 靜態(tài)變量
  • 靜態(tài)全局變量
  • 全局變量

如下面幾個(gè)例子

int globleParam = 1; //1>全局變量
static int sGlobleParam = 2; //2>靜態(tài)全局變量

int main(int argc, char * argv[]) {

    static int index = 3; //3>靜態(tài)局部變量
//    __block int index = 4; //4>__block 說(shuō)明符
    void (^pBlock)(void)  = ^{
       globleParam *= 2;
        sGlobleParam *= 2;
        index = 2;
    };

    pBlock();
最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2.1 Blcoks概要 2.1.1 什么是Blocks Blocks是C語(yǔ)言的擴(kuò)充功能——“帶有自動(dòng)變量(即局部...
    SkyMing一C閱讀 2,448評(píng)論 6 18
  • 全乎的Blocks講解 一句話概括Blocks: 帶有自動(dòng)變量(局部變量)的匿名函數(shù) Blocks模式 Block...
    凌巔閱讀 770評(píng)論 0 0
  • 一. Blocks的認(rèn)識(shí) 什么是Blocks? Blocks是C語(yǔ)言的拓展功能(帶有局部變量的匿名函數(shù))。局部變量...
    WellsCai閱讀 361評(píng)論 0 2
  • 在前兩篇中,我們介紹了一些關(guān)于C語(yǔ)言的重要概念,指針跟struct,這些基礎(chǔ)知識(shí)是我們深入學(xué)習(xí)block的前提,在...
    ccSundayChina閱讀 598評(píng)論 2 3
  • 時(shí)間管理名人堂 — 28 紫子梔 入選時(shí)間:2016年2月19日 入選級(jí)別:季級(jí) 入選理由:紫子梔,女,90后大學(xué)...
    V5特湘葉葉閱讀 256評(píng)論 0 0

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