首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

Objective-C Block深度解析:語法、捕獲語義與高級用法

     編輯:關於C

什麼是Block?

Block(代碼塊)是C語言的擴展,本質是一段可在未來執行的代碼,封裝了邏輯與上下文環境。它類似於其他語言的閉包或Lambda表達式,是Objective-C中實現回調、異步編程、API簡化的核心工具。

基礎語法

定義Block字面量

^返回類型(參數列表) { /* 執行代碼 */ }
  • 必須以^開頭。
  • 返回類型可省略(編譯器推導),無參數時()可省略。

聲明Block變量

返回類型 (^變量名)(參數列表);

例如: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; });

Block替代Delegate模式

傳統Delegate需定義協議、設置代理對象、實現多個方法。Block允許將回調邏輯內聯傳遞,代碼更聚合、可讀性更強。常見於網絡請求完成、動畫結束、按鈕點擊等場景。

記憶體管理提示

  • Block默認在棧上,若需長期持有(如屬性保存),必須[block copy]或Block_copy(block)將其拷貝到堆上。
  • AR環境下,Block屬性應聲明為copy:@property (copy) void (^completion)(void);
  • 避免循環引用:Block內捕獲self時,使用__weak typeof(self) weakSelf = self;。

總結

Block語法雖顯古怪,但掌握其值捕獲vs引用捕獲、棧到堆的拷貝、循環引用防範三大核心機制,即可靈活運用於異步回調、API設計等場景,顯著提升代碼表達力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved