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

Objective-C/C++ Block 捕獲外部變量完整指南

     編輯:關於C

Block 基礎

Block 是帶有自動變量捕獲的匿名函數,類似閉包。語法:^返回類型(參數列表) { 函數體 }。

捕獲規則

變量類型默認捕獲方式加 __block 後
局部自動變量值捕獲(const 拷貝),Block 內只讀引用捕獲(共享存儲),可讀寫,修改對外可見
靜態局部變量引用捕獲(地址),可讀寫同默認,__block 無效果
全局變量引用捕獲,可讀寫同默認
常量字面量/對象值捕獲(淺拷貝指針)引用捕獲變量指針,可修改指向

代碼示例

int a = 10;
void (^blk)() = ^{
    // a = 20; // 編譯錯誤:捕獲為 const int
    printf("%d", a); // 讀取 10
};

__block int b = 10;
void (^blk2)() = ^{
    b = 20; // 允許修改
    printf("%d", b); // 20
};
blk2();
printf("%d", b); // 20,外部也變了

static int s = 5;
void (^blk3)() = ^{ s = 6; }; // 合法,修改靜態變量

NSString *constStr = @"hello";
void (^blk4)() = ^{
    // constStr = @"world"; // 錯誤:捕獲為 const 指針
};
__block NSString *blkStr = @"hello";
void (^blk5)() = ^{ blkStr = @"world"; }; // 合法,修改指向

內存管理要點

  • __block 變量在堆上分配(或棧上但會隨 Block copy 移至堆),引用計數管理。
  • Block 複製到堆(Block_copy 或 ARC 下賦值給強引用)時,會 retain 捕獲的 __block 變量及對象指針。
  • 循環引用風險:Block 捕獲 self,self 又持有 Block → 用 __weak 或 __block (MRC) 弱化 self。

同名變量遮蔽

Block 內可定義與外部同名的局部變量,會遮蔽外部捕獲變量,外部變量在內部不可訪問。

最佳實踐

  1. 需要在 Block 內修改局部變量 → 加 __block。
  2. 只讀局部變量 → 默認值捕獲即可,效率高。
  3. 避免捕獲大對象值拷貝(如大結構體),改用指針或 __block。
  4. ARC 環境下 Block 多為堆對象,但在棧上創建時仍需注意生命周期。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved