《OC高級編程》之 Blocks(一)

概要

?

什么是Blocks

? ? 是帶有自動變量(局部變量)的匿名函數(shù)

? ? C++ 和 Object-C 使用類可保持變量值且能夠多次持有該變量本身,Blocks 提供了類似類生成實例或?qū)ο髞肀3肿兞恐档姆椒?br> ?

模式

?

語法

//完整形式
^void (int event){
    printf("buttonId: %d event = %d\n", i, event);
}
//^ 返回值類型(可省略) 參數(shù)列表(可省略) 表達(dá)式
//^(int count){return count + 1;}
//^{printf("kk");}

?

Block 類型變量

//函數(shù)指針
int func(int count){
    return count + 1;
}
int (*funcptr)(int) = &func;

//Block 類型變量
int (^blk)(int);

? ? Block 類型變量與一般 C 語言變量完全相同,可作為自動變量/函數(shù)參數(shù)/靜態(tài)變量/靜態(tài)全局變量/全局變量使用。

//賦值
int (^blk)(int) = ^(int count){return count + 1;}
int (^blk1)(int) = blk;
int (^blk2)(int);
blk2 = blk;
//作為函數(shù)參數(shù)
void func(int (^blk)(int)){}
//作為函數(shù)返回值
int (^func()(int)){
    return ^(int count){return count + 1;};
}
//使用typedef簡化
typedef int (^blk_t)(int);
void func(blk_t blk){};
blk_t func(){};

? ? 調(diào)用:

//函數(shù)
int result = (*funcptr)(10);
//Block
int result = blk(10);
//作為函數(shù)參數(shù)調(diào)用
int func(blk_t blk, int rate){
    return blk(rate);
}
//Block指針類型變量
blk_t blk = ^(int count){return count + 1;};
blk_t *blkptr = &blk; //似乎不可以?
(*blkptr)(10);

?

截獲自動變量值

int mian(){
    int val = 10;
    const char *fmt = "val = %d\n";
    void (^blk)(void) = ^{printf(fmt,val);};
        
    val = 2;
    fmt = "these values changed = %d\n";
        
    blk();
    //輸出 val = 10
    return 0;
}

? ? Block 表達(dá)式截獲所使用的自動變量的值,即保存該自動變量的瞬間值,因此在執(zhí)行 Block 語法后即使改寫 Block 中使用的自動變量也不會影響 Block 執(zhí)行時自動變量的值
?

__block 說明符

? ? 使用附有 __block 說明符的變量可在Block中賦值

__block int val = 10;
void (^blk1)(void) = ^{val = 1;};
blk1();
//val = 1;

?

截獲的自動變量

id array = [[NSMutableArray alloc] init];
    void (^blk)(void) = ^{
    id obj = [[NSObject alloc] init];
    [array addObject:obj]; //OK
    array = [[NSMutableArray alloc] init]; //報錯
};

? ? 賦值給截獲的值會產(chǎn)生編譯錯誤,但使用截獲的值卻不會有問題

? ? 在使用 C 語言數(shù)組時必須小心使用指針,截取自動變量的方法沒有實現(xiàn)對 C 語言數(shù)組的截獲,需使用指針(用 char *text 而不是 char text[])

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

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

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