blocks語法

一、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就變成了一個全局變量。在回調函數裏面就可以使用了。

View Code
複製代碼
__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);
複製代碼

 

View Code
複製代碼
#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;
}
複製代碼

 

 

 

 

 

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