標籤:
類似於js裡面的閉包,java中的匿名函數,C#的委託,可以將func當做參數傳遞:
1.Block的聲明
Block的定義和函數的聲明差不多,就是把函數名改成(^blockName)即可。下面是block聲明的代碼。
有傳回值的
int (^sumBlock) (int, int);
無傳回值的
void (^myBlock)(int, int);
2.給block塊賦值
給聲明好的block,賦值。block的值就是個函數體,給block塊賦值有兩種方式,一個在聲明的時候賦值,一個是先聲明在賦值。
先聲明再賦值
//代碼塊的聲明void (^myBlock)(int, int); //給代碼塊賦值myBlock = ^(int a, int b){ //test ++; //報錯 NSLog(@"main_test = %d", test); //blockVar++不報錯; blockVar ++; NSLog(@"blockVar = %d", blockVar); int sum = a + b; NSLog(@"a + b = %d", sum);};
在聲明的時候賦值
int (^sumBlock) (int, int) = ^(int a, int b){ int sum = a + b; return sum;};
3.調用block
block的使用和普通函數的使用相同,調用方法如下:
//調用代碼塊並接收傳回值int sum = sumBlock(20, 30);
4.把block當做參數傳入函數
//把代碼塊作為函數參數void blockFunction(int (^myBlock)(int, int)){ int sum = myBlock(10,20); NSLog(@"fun_sum = %d", sum);}
5.在代碼塊中使用局部變數和全域變數
在block中可以和對全域變數進行訪問和修改,但對局部變數只可以訪問,若想修改的話,我們可以在聲明局部變數的時候加上關鍵字__block
代碼如下
__block int blockVar = 0;
簡單理解Objective-C中的Block