Block 代碼塊 / 閉包

Block是用來封裝和保存代碼,有點像函數(shù),Block可以在任何時候執(zhí)行,效率高。


根據(jù)Block在內(nèi)存中的位置分為三種類型:

1、NSGlobalBlock:全局block,沒有引用外部變量。如:

int a = 10;

void (^block)() = ^{

? ? NSLog(@"block");

};

block();

2、NSStackBlock:棧block,引用外部變量, 當(dāng)函數(shù)返回時block將無效。

int a = 10;

void (^block)() = ^{

? ? NSLog(@"block %@", a);

};

block();

3、NSMallocBlock:堆block,對棧block進行copy,該辦block就會從棧區(qū)復(fù)制到堆區(qū),當(dāng)函數(shù)返回時block依然有效。


block的用法:

1、作為屬性。

比如:在Person類的.h文件定義屬性:

@property (nonatomic, copy) void (^eat)();

使用時:

Person *p = [[Person alloc] init];

p.eat = ^(){

? ? NSLog(@"eat");

}

2、作為方法的參數(shù)(函數(shù)式編程)

比如:在Person類的.h文件定義:

- (void)eat:(void(^)())block;

使用:

Person *p = [[Person alloc] init];

[p eat:^{

? ? NSLog(@"eat");

}];

3、作為方法的返回值(鏈?zhǔn)骄幊蹋?/p>

如:Person類的.h文件定義:

- (Person *(^)(int m))run;

.m文件實現(xiàn)方法:

- (Person *(^)(int m))run {

? ? return ^(int m) {

? ? ? ? NSLog(@"跑了%@米", m);

? ? ? ? return self;

????};

}

使用:

Person *p = [[Person alloc] init];

p.run(200).run(300).run(400);


函數(shù)式編程:訂閱代碼與業(yè)務(wù)邏輯代碼放一起。如AFN框架,網(wǎng)絡(luò)請求的代碼和得到請求結(jié)果的代碼放一起。

響應(yīng)式編程:當(dāng)所有條件滿足時就觸發(fā)。如KVO,代理,通知都是響應(yīng)式編程。

鏈?zhǔn)骄幊蹋汉唵卫斫饩褪峭ㄟ^連續(xù)“.”語法調(diào)用方法,方法返回的對象是方法本身。如Masonry框架。

(RAC,ReactiveCocoa框架,是函數(shù)響應(yīng)式編程。)

?著作權(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)容