聲明一個塊代碼的引用
塊代碼變數用來儲存到塊代碼的引用。使用和聲明函數指標相識的文法聲明塊代碼變數,只是把其中的*換成預留位置^。塊代碼類型基本上都是C語言的格式。下面就是一些有效塊代碼變數聲明:
void (^blockReturningVoidWithVoidArgument)(void); |
int (^blockReturningIntWithIntAndCharArguments)(int, char); |
void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int); |
塊代碼同樣支援可變參數列表。沒有參數的塊代碼必須在參數列表中使用void。
塊代碼在傳入參數,傳回值等方面使用中繼資料驗證,在設計上達到資料安全的目的。你可以把一個塊代碼的引用轉換成一個任何類型的指標,反之亦然。但是你不能通過一個指標引用來對一個塊代碼引用進行解引用--因為在編譯時間期不能計算塊代碼所佔大小。
你可以建立塊代碼的類型--只是你在多個地方建立同一種類型的塊代碼的最好的方式:
typedef float (^MyBlockType)(float, float); |
|
MyBlockType myFirstBlock = // ... ; |
MyBlockType mySecondBlock = // ... ; |
建立塊代碼
使用^標示一個塊代碼的開始。可能後面跟著使用一對小括弧括起來的參數列表。塊代碼的代碼部分是在一對大括弧裡面。下面是一個塊代碼定義的樣本,並把這個塊代碼賦值給一個前面聲明的塊代碼變數--和C語言一樣,塊代碼使用一個分號;作為定義的結束:
int (^oneFrom)(int); |
|
oneFrom = ^(int anInt) { |
return anInt - 1; |
}; |
如果你在塊代碼定義中沒有標示傳回值類型,傳回值類型會被通過塊代碼的內容推斷出來,如果這個傳回值是推斷出來的,並且參數列表是void,你可以省略這個void。如果多個return語句出現,他們必須返回完全相同類型的值(合適的時候必須使用轉換)。
全域塊代碼
在檔案範圍內,你可以定義一個塊代碼具有全域可用的:
#import <stdio.h> |
|
int GlobalInt = 0; |
int (^getGlobalInt)(void) = ^{ return GlobalInt; }; |