程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> Block用法解析

Block用法解析

編輯:關於C

Block代碼塊是對C做出的一個補充,初次體驗代碼塊,無比的不適應。古怪的語法確實讓人不易入門甚至精通。但若能夠深入精通Block的使用,會給代碼帶來層次上的提升。Block就是一段在將來被執行的代碼

定義塊語法

    ^[塊返回值類型](形參類型1 形參1,形參類型2  形參2,...)
    {
    //塊執行任務
    }

需要注意的是定義塊必須以^開頭

定義塊變量

塊返回值類型  (^塊變量名)(形參類型1,形參類型2,...);

簡單實例

     //定義塊變量
    void(^NSLogStr)();
   //通過塊變量調用塊
    NSLogStr=^(void)
    {
    };
     //定義無返回值不帶參數
   void (^NSLogStr)()=^()
    {
        //代碼塊實現的方法
        NSLog(@"Hello Block");
    };
    //通過代碼變量調用代碼塊
    NSLogStr();

局部變量

在默認狀態,當用塊訪問局部變量的值時候,是不允許修改局部變量的。

這裡寫圖片描述

但當為局部變量加上 __block修飾就可以修改局部變量

 __block int a=10;

   void (^NSLogStr)()=^()
    {
        //讀取局部變量a,是可以的
        NSLog(@"%d",a);
        //試圖修改局部變量,錯誤的。無法運行通過
        a=20;
        NSLog(@"%d",a);

        NSLog(@"Hello Block");
    };
    //通過代碼變量調用代碼塊
    NSLogStr();
2016-05-01 16:20:23.860 [2470:103092] 10
2016-05-01 16:20:23.861 [2470:103092] 20
2016-05-01 16:20:23.861 [2470:103092] Hello Block
看下面代碼
    int a=10;

   void (^NSLogStr)()=^()
    {
        //讀取局部變量a,是可以的
        NSLog(@"%d",a);
        NSLog(@"Hello Block");
    };
    a=30;
    //通過代碼變量調用代碼塊
    NSLogStr();
      NSLog(@"%d",a);

猜猜應該打印的值是多少?兩個a都是30?

2016-05-01 16:27:57.600 [2543:107259] 10
2016-05-01 16:27:57.601 [2543:107259] Hello Block
2016-05-01 16:27:57.601 [2543:107259] 30

Why?

原來,在定義代碼塊時就已經把局部變量的值復制到塊 。所以即使在定義後、調用前修改局部變量,依然是沒有用的。 倘若我們我們想等到執行時才去訪問獲取甚至去修改局部變量的值,我們可以在局部變量前面加__block

Block高級用法

代碼塊作為函數的參數(只能當函數的最後一個參數)

這時候我們需要引入一個typedef用typedef可以定義代碼塊類型,主要有兩個作用

復用塊變量類型,使用塊變量類型可以重復定義多個塊變量

使用塊變量類型定義函數參數,這樣可定義帶塊參數的函數

typedef 塊返回值類型(^塊變量類型)(形參類型1,形參類型2,....);

定義一個函數,Block作為函數最後一個參數

typedef NSString* (^LogStr)(NSString *);

void NSLogStr(NSString *name,LogStr log)
{
    NSLog(@"%@%@",log(name),@",歡迎您");
}
調用:
   NSString *name=@"喬布斯";
 NSLogStr(name, ^NSString *(NSString *name) {
     return name;
 });

代碼塊取代代理傳值

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved