iOS Block簡介

Block是對象,它封裝了一段代碼,這段代碼能夠在任什麼時候候執行。block能夠做爲函數參數或者函數的返回值,而其自己又能夠帶輸入參數或返回值。它和傳統的函數指針很相似,可是有區別:block是inline的,而且它對局部變量是隻讀的。數據結構

一、實體形式

Block的實際行爲和Function很像,Block實體形式以下:框架

^(傳入參數列){行爲主體};函數

Block實體開頭是「^」,接着是由小括號所包起來的參數列(好比 int a, int b, int c),行爲主體由大括號包起來,專有名字叫作block literal。行爲主體能夠用return回傳值,類型會被compiler自動辨別。若是沒有參數列要寫成: ^(void)。atom

Block的定義:spa

     int (^myBlock) (int a,int b) = ^(int a,int b){  
       return a+b;  
   };  翻譯

這個例子是,定義了一個名爲myBlock的blocks對象,它帶有兩個int參數,返回int。等式右邊就是blocks的具體實現,是否是有點像方法的定義?代理

二、Block特色

(1)在類中,定義一個Block變量,就像定義一個函數;指針

(2)Block能夠定義在方法內部,也能夠定義在方法外部;對象

(3)只有調用Block時候,纔會執行其{}體內的代碼;事件

三、Block語法

總結以下:

(1)block做爲本地變量(local variable)

returnType (^blockName)(parameterTypes) = ^returnType(parameters){...};

(2)block做爲類的成員屬性(@property)

@property (nonatomic, copy) returnType (^blockName)(parameters);

這時候能夠類比delegate,實現代理功能。

(3)block做爲函數參數(method parameter)

- (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName;

調用包括block參數的函數,

[someObject somethodThatTakesABlock:^returnType(parameters){...}];

(4)使用typedef定義block類型

typedef returnType (^TypeName)(parameterTypes);

TypeName blockName = ^returnType(parameters){...};

上面的內容翻譯自fuckblocksyntax,你們忘了block語法的時候能夠反覆的看看。

 

四、Block的使用舉例

做爲本地變量:

int (^Mutiply)(int,int) = ^(int num1,int num2){

    return num1*num2;

};

Block能夠訪問局部變量,可是不能修改。好比下面的代碼就會報編譯錯 

  int num = 0;  
    //使用block   
    int (^myBlock) (int a,int b) = ^(int a,int b){  
        num = a+b;  
        return num;  
    };  

 

若是要修改就要加關鍵字:__block (注意,是兩個下劃線"_")

__block int num = 0;  
    //使用block   
    int (^myBlock) (int a,int b) = ^(int a,int b){  
        num = a+b;  
        return num;  
    };  

__block修飾局部變量,是對棧上的block調用copy,每次會返回新複製到堆上的block的指針,把__block變量複製至堆一份。

做爲函數的參數,blocks某種意義上替代了回調函數或者delegate。當函數調用了,假設某個事件觸發,這時block裏的內容就會運行。這樣有利於代碼的整合和閱讀,你不須要處處去實現委託方法了。 

 

五、Block優點

Blocks 一般表明一個很小、自包的代碼片斷。所以它們做爲封裝的工做單元在並 發執行,或在一個集合項上,或當其餘操做完成時的回調的時候很是實用。

Blocks 做爲傳統回調函數的一個實用的替代辦法,有如下兩個緣由:

  1. 它們可讓你在調用的地方編寫代碼實現後面將要執行的操做。

    所以 Blocks 一般做爲框架方法的參數。

  2. 它們容許你訪問局部變量。而不是須要使用一個你想要執行操做時集成全部上下文的信息的數據結構來 進行回調,你能夠直接簡單的訪問局部變量。 

相關文章
相關標籤/搜索