概要
?
什么是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[])