Block 簡單總結

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;
}


實例


發佈了35 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章