Objective-C學習之旅(十)----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;
}

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM