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; 缺少變數名稱括號,編譯器無法識別。
// 無參無回傳
void (^blockReturningVoidWithVoidArgument)(void);
// 回傳 int,參數 int、char
int (^blockReturningIntWithIntAndCharArguments)(int, char);
// 陣列:10 個 Block,參數 int,無回傳
void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int);
typedef 簡化:typedef void (^MyVoidBlock)(void);const 複製,需修改請加 __block。copy 會自動管理記憶體,手動釋放不再需要。