首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS Block 語法:在陣列中儲存並枚舉執行 Block

     編輯:程式設計綜合問答

正確宣告與儲存 Block

Block 在 Objective-C 中是帶有捕獲變數的匿名函數,若要放入 NSArray,必須先 copy 到堆區:

self.myArray = @[
    [^{ NSLog(@"a"); } copy],
    [^{ NSLog(@"b"); } copy]
];

枚舉執行的正確語法

枚舉時需將 id obj 強制轉型為正確的 Block 類型,不可省略括號:

[self.myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    void (^block)(void) = obj;   // 正確:宣告 Block 變數
    block();                     // 執行
}];

錯誤寫法 void (^) (void) block = obj; 缺少變數名稱括號,編譯器無法識別。

Block 類型宣告速查表

// 無參無回傳
void (^blockReturningVoidWithVoidArgument)(void);

// 回傳 int,參數 int、char
int (^blockReturningIntWithIntAndCharArguments)(int, char);

// 陣列:10 個 Block,參數 int,無回傳
void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int);

實務建議

  • 若 Block 類型重複使用,建議用 typedef 簡化:
    typedef void (^MyVoidBlock)(void);
  • Block 捕獲區域變數時預設為 const 複製,需修改請加 __block。
  • ARC 環境下 copy 會自動管理記憶體,手動釋放不再需要。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved