聲明一個塊代碼的引用
塊代碼變量用來保存到塊代碼的引用。使用和聲明函數指針相識的語法聲明塊代碼變量,只是把其中的*換成佔位符^。塊代碼類型基本上都是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; }; |