Block(代碼塊)是C語言的擴展,本質是一段可在未來執行的代碼,封裝了邏輯與上下文環境。它類似於其他語言的閉包或Lambda表達式,是Objective-C中實現回調、異步編程、API簡化的核心工具。
^返回類型(參數列表) { /* 執行代碼 */ }
^開頭。()可省略。返回類型 (^變量名)(參數列表);
例如:void (^myBlock)(int);
int a = 10;
void (^blk)() = ^{ NSLog(@"%d", a); }; // 捕獲 a=10
a = 30;
blk(); // 輸出 10,而非 30
__block修飾符:引用捕獲(可讀寫)在變量聲明前加__block,Block將捕獲變量的地址,實現雙向同步:
typedef NSString* (^LogBlock)(NSString* name);
void greet(NSString* name, LogBlock logger) {
NSLog(@"%@, 歡迎您", logger(name));
}
// 調用
greet(@"喬布斯", ^NSString*(NSString* n) { return n; });
傳統Delegate需定義協議、設置代理對象、實現多個方法。Block允許將回調邏輯內聯傳遞,代碼更聚合、可讀性更強。常見於網絡請求完成、動畫結束、按鈕點擊等場景。
[block copy]或Block_copy(block)將其拷貝到堆上。copy:@property (copy) void (^completion)(void);self時,使用__weak typeof(self) weakSelf = self;。Block語法雖顯古怪,但掌握其值捕獲vs引用捕獲、棧到堆的拷貝、循環引用防範三大核心機制,即可靈活運用於異步回調、API設計等場景,顯著提升代碼表達力。