Blocks

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賦值。


















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

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

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