iOS指向函數的指標和block

來源:互聯網
上載者:User

標籤:style   blog   color   使用   strong   資料   

  一:block基礎知識

block基礎知識

基本概念:block是用來儲存一段代碼的;^:是block得標誌  好比*:是指標的標誌

  特點:1:儲存一段代碼;

     2:可以有參數和傳回值;

     3:可以作為函數的參數傳遞;

   與代碼塊的區別,代碼塊裡的代碼會自動執行,block中代碼要手動調用;

 

二:普通資料類型、指向函數的指標、block的定義的類比

1:基礎資料型別 (Elementary Data Type):

  例如:int a = 10; 

  格式:資料類型  變數名 = 值;

2:指向函數的指標:可以仿照上邊基礎資料型別 (Elementary Data Type)的定義

  例如:void (*p)() = function;    (funciton是某個定義好的函數) 

  格式:函數類型  *指標變數名 = 函數名;

     說明:由於p指標是指向函數的,所以(*p)()中的紅色小括弧必須有,因為函數本身是要參數的,即使沒有參數也要寫();

  如果p指向的函數有參數:int (*pp)(int, int) = sum;

  調用指向函數的指標:

     無參:p();  

     有參:int sum = pp(2,3);

3:block的定義和使用,和指向函數的指標格式很像

  例如:void (^firstBlock)() = ^(){...代碼...};   說明:藍色的小括弧可以不寫,有參數的時候必須寫

  格式:block類型  ^block名稱 = ^{程式碼片段};

  有參數block:int (^multiBlock)(int, int) = ^(int a, int b){

               return a * b;

           };

  調用block:無參:firstBlock()

         有參:int result = multiBlock(2, 3);

  

// 備忘:指向指標的函數和block,可以像基礎資料型別 (Elementary Data Type)一樣可以分步定義 :int (^multiBlock)(int, int);        multiBlock = ^(int a, int b){        return a * b;    };

 

範例程式碼:

 1 // 函數定義 2 int sum(int a, int b) 3 { 4     NSLog(@"a+b=%d", a + b); 5     return 2; 6 } 7  8 void logSome() 9 {10     NSLog(@"我是void型的輸出函數");11 }12 13 int main()14 {15     /***   1:基礎資料型別 (Elementary Data Type)的定義 ***/16     int a = 10;17     // 1.1先定義 後賦值18     int b;19     b = 20;20     21     /***   2:指向了函數的指標 ***/22     23     // 2.1:指向有參數的sum(int a, int b)函數24     int (*p)(int, int) = sum;25     // 2.2:指向無參數的函數logSome()函數26     void (*logP)() = logSome;27     28     // 調用指向函數的指標函數29     p(2, 3);30     logP();31     32     /***   3:block定義和使用 ***/33     34     // 3.1:沒有參數的block定義35     void (^firstBlock)() = ^{36         37         NSLog(@"注意:(^multiBlock)(),這裡的小括弧必須寫,不管有沒有參數");38         39         NSLog(@"而後邊的\" ^(){ \"的小括弧可以不寫");40     };41     42     // block的調用43     firstBlock();44     45     // 3.2 帶參數和有傳回值的block46     int (^multiBlock)(int, int) = ^(int a, int b){47         return a * b;48     };49     50     // 調用block51     int result = multiBlock(2, 3);52     NSLog(@"%d", result);53     54 }

 

三:利用typedef 定義的block

 利用typedef可以將繁瑣的block定義簡單化

  例如:typedef void (^Myblock)(); 然後可以用Myblock 建立一個block,建立的格式像類建立對象

  

// 利用typedef定義blocktypedef void (^Myblock)();int main(){    // 利用自訂的block建立一個block    Myblock myblock = ^{        NSLog(@"");    };    }

 

四:block和指向函數的指標作為函數參數

利用typedef可以將繁瑣的block簡單後,這個block就成為了一種類型,可以像類一樣建立對象,指向函數的指標同樣可以

// 利用typedef定義定義指向函數的指標typedef void (*Tp)();// 利用typedef定義blocktypedef void (^Myblock)();void logSome(){    NSLog(@"我是void型的輸出函數");}// 指向函數的指標作為參數void test1(Tp p){    p();}// block作為函數的參數void test2(Myblock mb){    mb();}int main(){    // 指向函數的指標定義    Tp myP = logSome;    test3(myP);        // 定義block    Myblock mb = ^{        NSLog(@"block輸出");    };    test4(mb);}

 

備忘:c語言中的函數和oc中的方法有些不一樣,c語言函數的參數要想寫block後者指向函數的指標,必須先用typedef吧block或者指向函數的指標定義為一種類型,然後才能在函數的參數中傳遞;

在oc的方法定義中,可以直接用block來作為參數;

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.