1. block
1>block的定義: int (^myBlock)(int , int )=^( int x, int y ) { return x+y ; } 調用: int sum=myBlock(12,23); 此時sum =35 。
2>函數指針的回顧: 定義一個函數 int sum ( int x, int y ) { return x+y ;} 定義函數指針: int (*p) (int x, int y ) ; 此時*p只能指向:返回值爲int,並且參數爲兩個int類型的函數。
使用: p=sum; p(1,2 ); (*p)(2,3); 注意:定義的時候 形參 x,y 可以不寫。
2>函數指針別名: typedef (*NewType) (int , int ) ; NewType f1,f2,f3 ; 此處f1 纔是函數指針。
3> block類型的typedef:
typedef int (^MyBlock) (int , int ) ; 這樣就可以使用MyBlock去定義 類似 int (^BlockA)(int ,int ) 這種結構的block變量。
例如: MyBlock t1; t1 = ^(int x,int y ) { return x+y;} ; int sum =t1(12,12) ; 此時t1 =24;
4>block訪問外部變量:block中可以訪問外部變量,當使用外部變量的時候,會把外部變量以const的方式複製一份放到內存中(堆區,block存在於堆區)。
block中不允許修改外部變量的值,const方式複製的。
__block int m=10 ; __block 修飾詞表示,不再以const的形式複製m 變量。修改內部的局部變量的值,之後打印m的話會使用block的值。
block 可以修改全局變量的值。
5>block的分類:全局block:函數外部定義的block,如果函數內部定義的block,沒有引入變量,那麼也是全局block
棧block:引入變量的block
堆block: 複製自棧block的,對全局block不會有任何影響,返回的仍然是全局block
6>block 作爲函數的參數:
void work( void ^workBlock() ){ workBlock();} void workDay(int n) { work( ^{ NSLog(@"fdkjak") } ;) ; }
7>block作爲函數的返回值:
1》使用typedef定義一個新的類型: typedef int(^newType) ( int ,int );
2》使用新定義的類型作爲函數的返回值。 newType test(){ return ^(int x , int y ){ return x+y ;} ;}
3》調用: 在main函數中: newType block =test(); block(1,2);
8>block 使用技巧: 使用助記符 inlineblock 可以快速創建block結構。