IOS--Block入門

Block介紹
dom

  一:Block是一種具備匿名功能的內嵌函數,特性以下:函數

(1):如通常函數能擁有帶有型態的參數spa

(2):擁有回傳值code

(3):能夠獲取和選擇性地修改做用域的狀態索引

 二:Block的使用ip

  Block能夠簡化代碼塊,適合用來創建一些同步執行的代碼,封裝一些小型的工做或是做爲某項工做完成時的回傳呼叫。作用域


三:聲明和建立Block;get

(1)用^來聲明變量:返回值/聲明方法/參數
同步

1: /* 回傳void ,參數也是void 的block*/
   2: void (^blockReturningVoidWithVoidArgument)( void );
   3: /* 回傳整數,兩個參數分別是整數和字元型態的block*/
   4: int   (^blockReturningIntWithIntAndCharArguments)( int , char );
   5: /* 回傳void ,含有10 個block 的陣列,每一個block 都有一個型態爲整數的參數*/
   6: void (^arrayOfTenBlocksReturningVoidWinIntArgument[ 10 ])( int );
   7: X.3.2 創建一個Block 
   8:  
   9: 咱們使用「^」來開始一個block,並在最後使用「;」來表示結束,下面的範例示範了一個block變數,而後再定義一個block把它指定給block變數: 
  10:  
  11: int (^oneFrom)( int ); /* 宣告block 變數*/
  12:     /* 定義block 的內容並指定給上面宣告的變數*/
  13:     oneFrom = ^(int anInt)
  14:                 {
  15:                     return anInt = - 1 ; 
  16:                 };

(2)咱們能夠聲明一個全局的block;it

1: int GlobalInt = 0 ;
   2: int (^getGlobalInt)( void ) = ^ ( void ) { return GlobalInt ;};


四:Block的使用(初級)

 1: int multiplier = 7 ;
   2: int (^myBlock)( int ) = ^( int num)
   3: {
   4:     return num * multiplier;
   5: };
   6: printf ( "%d" , myBlock( 3 ));
   7: //結果會打印出21

  說明:

(1):聲明一個myblock變量,用^符號表示這是一個block

 (2):表示myblock是一個返回值爲 int 的block

   (3) : 他有一個參數,型態爲整形,參數名爲 num


   直接使用Block:多數狀況下,咱們並不須要聲明block變量。咱們能夠直接在須要使用block的地方直接用內嵌的方式將block的內容寫出來,直接將block做爲它的參數;

1: char *myCharacters[ 3 ] = { "TomJohn" , "George" , "Charles Condomine" };
   2: qsort_b (myCharacters, 3 ,
   3:          sizeof ( char *),
   4:          ^( const void *l, const void *r)//block部分
   5:             {
   6:                 char *left = *( char **)l;
   7:                 char *right = *( char **)r;
   8:                 return strncmp (left, right, 1 );
   9:             }                            //end
  10: );

  備註:若是修改內容的block,在前面添加__block   int  name;


五:__block變量  若要內部能夠訪問修改不準添加關鍵字

 1: // 加上__block 修飾詞,因此能夠在block 中被修改。
   2: __block int x = 123 ;
   3: void (^printXAndY)( int ) = ^( int y)
   4:     {
   5:         x = x + y;
   6: printf ( "%d %d\n" , x, y);
   7:     };
   8: // 將會印出579 456
   9:     printXAndY( 456 );
  10: //x 將會變成 579;
  11: 下面咱們使用一個範例來介紹各種型的變數和block之間的互動:
  12:
  13: extern NSInteger CounterGlobal;
  14: static NSInteger CounterStatic;
  15: {
  16: NSInteger localCounter = 42 ;
  17: __block char localCharacter;
  18: void (^aBlock)( void ) = ^( void )
  19:     {
  20:         ++ CounterGlobal ; //能夠存取。
  21:         ++ CounterStatic ; //能夠存取。 
  22: CounterGlobal = localCounter; //localCounter在block 創建時就不可變了。
  23:         localCharacter = 'a' ; //設定外面定義的localCharacter 變數。
  24:     };
  25:     ++localCounter; //不會影響的block 中的值。
  26:     localCharacter = 'b' ;
  27:     aBlock(); //執行block 的內容。
  28: //執行完後,localCharachter 會變成'a'
  29: }

六:Block的使用

  (1):聲明一個block,直接使用block

1: int (^oneFrom)( int ) = ^( int anInt) {
   2: return anInt - 1 ;
   3:     };
   4: printf ( "1 from 10 is %d" , oneFrom( 10 ));
   5: //結果會顯示:1 from 10 is 9
   6: float (^distanceTraveled)( float , float , float ) = ^( float startingSpeed, float acceleration, float time)
   7:     {
   8: float distance = (startingSpeed * time) + ( 0.5 * acceleration * time * time);
   9: return distance;
  10:     };
  11: float howFar = distanceTraveled( 0.0 , 9.8 , 1.0 );
  12: //howFar會變成4.9


(2):將block看成函數的參數

 1: char *myCharacters[ 3 ] = { "TomJohn" , "George" , "Charles Condomine" };
   2: qsort_b (myCharacters, 3 , sizeof ( char *),
   3:             ^( const void *l, const void *r)
   4:             {
   5: char *left = *( char **)l;
   6: char *right = *( char **)r;
   7: return strncmp (left, right, 1 );
   8:             } // 這裏是block 的終點。
   9:             );
  10: // 最後的結果爲:{"Charles Condomine", "George", "TomJohn"}


(3)將block看成方法的參數:咱們能夠像傳遞通常參數的方式傳遞block;

 1: // 全部的資料
   2: NSArray *array = [ NSArray arrayWithObjects : @"A" , @"B" , @"C" , @"A" , @"B" , @"Z" , @"G" , @"are" , @" Q" ,nil ];
   3: // 咱們只要這個集合內的資料
   4: NSSet *filterSet = [ NSSet setWithObjects : @"A" , @"B" , @"Z" , @"Q" , nil ];
   5: BOOL (^test)( id obj, NSUInteger idx, BOOL *stop);
   6: test = ^ ( id obj, NSUInteger idx, BOOL *stop) {
   7: // 只對前5 筆資料作檢查
   8: if (idx < 5 ) {
   9: if ([filterSet containsObject : obj]) {
  10: return YES ;
  11:               }
  12:       }
  13: return NO ;
  14: };
  15: NSIndexSet *indexes = [array indexesOfObjectsPassingTest :test];
  16: NSLog ( @"indexes: %@" , indexes);
  17: // 結果:indexes: <NSIndexSet: 0x6101ff0>[number of indexes: 4 (in 2 ranges), indexes: (0-1 3-4)]
  18: // 前5筆資料中,有4筆符合條件,它們的索引值分別是0-1, 3-4
相關文章
相關標籤/搜索