iOS 學習之 Block

概述:

-代碼塊對象簡稱爲"代碼塊".是對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.代碼塊的內聯

NSArray *array = @[@"One", @"Two", @"Three", @"Four"];

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修飾符


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章