概述:
-代碼塊對象簡稱爲"代碼塊".是對c語言函數的擴展.運行在iOS4.0和OS X10.6版本以上
-代碼塊實際上是c語言實現的,所以在各種以c作爲基礎的語言內都是有效的包括:object-c,c++,以及object-c++
-代碼塊本質是和其他變量類似.不同的是,代碼塊存儲的數據是一個函數體.使用代碼時,可以像調用其他函數一樣,傳入參數,並得到返回值.
函數指針 vs 代碼塊
函數指針的語法格式
返回值類型 (*函數名)(參數列表);
eg:void (*myFunction)(void);
代碼塊的語法格式
返回值 (^代碼塊名)(參數列表) = ^返回值類型 (參數列表) {表達式;};
eg: void (^myBlock)() = ^{printf("Hello,Block\n");}
說明:
返回值類型和參數列表都可以有條件的省略
省略返回值類型時,若表達式中有return語句就使用該返回值的類型,若沒有,則爲void
省略返回值類型時,若表達式中有多個return語句,則所有的語句返回值的類型必須相同
如果不使用參數,則參數列表也可以省略
dda 打a'd
代碼塊的使用
a.直接使用
void (^myBlaock)() = ^{printf("HEllo,world!\n");};
myBlock();
b.代碼塊的內聯
NSLog(@"Sorted array: %@", sortedArray);
NSLog(@"Unsorted array: %@", array);
NSArray *sortedArray = [array
sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
NSLog(@"Sorted array :%@",sortedArray);
使用typedef定義相同類型的代碼塊
typedef void (^ChangelableText)(NSString *);
聲明 ChangeLableText blk;
代碼塊的變量
-全局變量和靜態變量在代碼塊內部可以正常使用(改其值)
-局部變量在代碼塊內部無法修改其值,原因是代碼塊的局部變量在編譯階段被看作位常量
-如果需要在代碼塊中修改局部變量,需要在局部變量前面加__block修飾符