Block 可以封裝一段代碼,然後可以把它作爲一個函數或方法的形參,又可以作爲一個函數或方法的返回值,它又可以當成一個函數或方法來執行,功能很強大。
block(內聯函數)從源代碼層面來看,它有函數的結構,而在編譯後,卻不具備函數的性質。在它編譯的時候,類型宏替換,使用函數體替換調用處的函數名。
- block 封裝一段代碼,可以在任何時候執行。
- block可以作爲函數(或方法)的參數,又可以作爲函數(或方法)的返回值,而其本身又可以帶傳入參數或者返回值。
- 蘋果官方建議儘量多用block。在多線程、異步任務、集合遍歷、集合排序、動畫轉場用得很多。
block的定義
// 有傳參和返回值
/*
* 定義一個叫MyBlock 的blocks對象,它帶有兩個 int 參數,返回int。等式的右
* 邊是blocks的具體實現。
*/
int (^MyBlock)(int, int) = ^(int a, int b)
{
return a+b;
};
// 沒有傳參和返回值
void (^MyBlock)() = ^{
};
/*
* 其實它就像定義一個變量,
* 數據類型 變量名 = 變量的值 ;
* 它的數據類型像函數的返回值類型,變量名就像一個函數名,後面跟個小
* 括號。
*/
注意:
block可以訪問局部變量,但是不能修改。例如:
int sum = 10;
int (^MyBlock) (int) = ^(int num){
sum++; //編譯報錯
return num*sum;
};
如果要修改就要加關鍵字: __block
__block int sum = 10;
block 和 函數的指針對比
- 定義函數指針:int (*myFun) ();
- 定義block:int (^myBlocks) (int, int);
- 調用函數指針:(*myFun) (10, 20);
- 調用blocks:myBlocks(10, 20);
block 的賦值
- 在聲明的同時定義變量,然後進行賦值
int (^mySum) (int, int) = ^(int a, int b){
return a+b;
};
- 也可以先用 typedef 先聲明類型,再定義變量進行賦值
typedef int (^mySum) (int, int);
mySum sum = ^(int a, int b){
return a+b;
}
實例