Blocks是C語言的擴(kuò)充功能。? 用一句話來概括就是:帶有自動(dòng)變量(局部變量)的匿名函數(shù)。
在其他語言中Block的名稱
程序語言?????????????????????? Block的名稱
C + Blocks?????????????????? Block
Smalltalk?????????????????????? Block
Ruby????????????????????????????? Block
LISP?????????????????????????????? Lambda
Python?? ? ? ? ? ? ? ? ? ? ? ? ? Lambda
C ++11??????????????????????????? Lambda
Javascript?????????????????????? Anonymous function
Blocks模式--Block語法
^ 返回值類型 參數(shù)列表 表達(dá)式
^ int (int count) {return count + 1}
^ 參數(shù)類型 表達(dá)式
^(int count) {return count + 1}
^ 表達(dá)式
^{printf("balabalabalabala");}??? 或者? ^ void (void) {printf("balabalabala");}
聲明Block類型變量僅僅是將聲明函數(shù)指針變量的“*”變?yōu)椤癪”。該Block函數(shù)變量與一般的C語言變量完全相同,可作為一下用途使用:
自動(dòng)變量、函數(shù)參數(shù)、靜態(tài)變量、靜態(tài)全局變量、全局變量
如以下例子可供參考:
int (^blk) (int) = ^(int count){return count + 1}
int (^blk1) (int) = blk;
int (^blk2) (int);
blk2 = blk1;
在函數(shù)參數(shù)中使用Block類型變量可以向函數(shù)傳遞Block。
通常我們使用typedef來聲明Block類型變量,以達(dá)到簡化使用函數(shù)指針類型時(shí)的復(fù)雜形式。
typedef int (^blk_t) (int);
在Block函數(shù)中可以截獲自動(dòng)變量值,但是不能改變其值。
如需改變,需要__block定義自動(dòng)變量即可達(dá)到目的。如:
int val = 0;
void (^blk)(void) = ^ {val = 1;};
blk();
printf("val = %d\n", val);
如此即會(huì)報(bào)錯(cuò)。
修改方案: 將val定義改為 : __block int val = 0;
例2:
id array =[ [NSMutableArray alloc] init];
void (^blk) (void) = ^{
?id obj = [[NSObject alloc] init];
[array addobect:obj];
}
不會(huì)報(bào)錯(cuò)。
id array =[ [NSMutableArray alloc] init];
void (^blk) (void) = ^{
? ? array = [ [NSMutableArray alloc] init];
}
如此則會(huì)報(bào)錯(cuò)啦。若將array定義前加__block 則不會(huì)出錯(cuò)了。
因?yàn)樵贐lock函數(shù)中可以使用截獲的值但是不能直接像截獲的變量array賦值。