OC加強3

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結構。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章