一、Blocks
Block是一個C Level的語法以及運行時的一個特性,和標準C中的函數(函數指針)類似,但是其運行需要編譯器和運行時支持,從IOS4.0開始就很好地支持Blocks。Blocks主要用在一些回調函數的用法上,2個對象通信需要一些回調的時候,比如說2個對象在運行,我們需要知道其中一個對象什麼時候完成,我們就需要一個回調函數,之前我們用代理,但是有些小的地方用代理大材小用,Blocks可以用來做一些代理的很好地支撐,可以用來做邊界或者一些地方的回調函數。
心得:Blocks實質其實就是回調函數。
二、C函數指針和Blocks申明
C語言函數指針 int (* CFunc) (int a)
返回值 變量名 參數類型 參數值
Blocks int(^ BFunc) (int a)
三、C函數指針和Blocks調用
1、C函數指針調用:
int(* CFunc)(int a)函數調用
int ret=CFunc(100);
2、Blocks調用
int(^BFunc)(int a)函數調用
int ret=BFunc(100);
四、Blocks typedef 類型定義
C語言函數指針typedef
typedef int(*SumBlockT)(int a,int b)
Blocks typedef 定義
typedef int(^SumBlockT)(int a,int b)
五、_ _block關鍵字
1、這個關鍵字主要是用在Blocks裏面需要和一個函數通訊來修飾一些臨時變量
比如說:我們函數裏面有一段blocks,這個blocks裏面需要修改函數裏面的一些方法, 那麼函數裏面的變量是一些臨時變量,當這個函數調完了的時候,這個變量就沒有了。就從這個棧當中銷燬了。_ _blocks就是說可以讓這個變量成爲全局的。我們在Blocks裏面調用的時候就可以修飾這裏面的變量。
2、一個Block的內部是可以引用自身作用域外的變量的,包括static變量,extern變量或自由變量(定義一個變量的時候,如果不加存儲修飾符,默認情況下就是自由變量auto,auto變量保存在stack中的。除了auto之外還存在register,static等存儲修飾符),對於自由變量,在Block中是隻讀的。在引入block的同時,還引入了一種特殊的_ _block關鍵字變量存儲修飾符
六、Blocks案例
我們在給這個函數賦值的時候,myblocks3的變量sum還沒有執行,因爲sum是臨時變量,也就是說我除了這個函數之外,這個變量在別的地方沒有使用過,爲了能再函數中能夠訪問到sum,我們在int sum=0之前加一個__block,這樣sum就變成了一個全局變量。在回調函數裏面就可以使用了。
__block int sum = 0; int (^myblocks3) (int a, int b) = ^(int a, int b) { sum = a+b; return 3; }; myblocks3(20, 30); NSLog(@"sum is %d", sum);
#import <Foundation/Foundation.h> // 定義Blocks的typedef typedef int (^SumBlockT) (int a, int b); int main (int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); void (^myblocks) (void) = NULL; myblocks = ^(void) { NSLog(@"in blocks"); }; // 給myblocks 賦值 NSLog(@"before myblocks"); myblocks(); // 執行myblocks; NSLog(@"after myblocks"); /* before myblocks in blocks after myblocks */ int (^myblocks2) (int a, int b) = ^(int a, int b) { int c = a+b; return c; }; NSLog(@"before blocks2"); int ret = myblocks2(10, 20); NSLog(@"after blocks2 ret %d", ret); __block int sum = 0; int (^myblocks3) (int a, int b) = ^(int a, int b) { sum = a+b; return 3; }; myblocks3(20, 30); NSLog(@"sum is %d", sum); SumBlockT myblocks4 = ^(int a, int b) { NSLog(@"c is %d", a+b); return 0; }; myblocks4(50, 20); } return 0; }