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

Objective-C學習筆記_Block

編輯:關於C語言

Objective-C學習筆記_Block


一、Block語法

Block:塊語法,本質上是匿名函數(沒有名稱的函數),Block變量存放函數的實現,通過Block變量能直接調?函數。標准C裡面沒有Block,C語言的後期擴展版本,加?了匿名函數。C++、JS、Swift等語?,有類似語法,叫做閉包。Block語法和函數指針很相似。

Block語法

Block類型:int (^)(int) Block變量:myBlock Block值:^ int (int num){ return 7 * num;} 即:^ 返回值類型 (參數列表){函數體} 其中 返回值類型 可以省略。
        /* Block 類型: int (^)(int, int)
         * Block 變量: block1
         * Block 的值: ^int (int x, int y) { return x + y; };
           ^ 返回值類型 (參數列表) { 函數體 } (返回值類型可以省略)
         */

        /* 1. 無返回值, 無參數的Block */
        void (^block3)() = ^()
        {
            NSLog(@Hello, World!);
        };
        block3(); /* Block調用 */

        /* 2. 無返回值, 有參數 */
        void (^block4)(int, int) = ^(int x, int y)
        {
            NSLog(@%d, x + y);
        };
        block4(3, 45);

        /* 3. 有返回值, 無參數 */
        int (^block5)() = ^()
        {
            return 100;
        };
        NSLog(@%d, block5());

        /* 4. 有返回值, 有參數 */
        int (^block6)(int, int) = ^(int x, int y)
        {
            return x > y ? x : y;
        };
        NSLog(@%d, block6(3, 5));

二、Block使?

int (^block1)(int x, int y) = ^(int x, int y) {
  return x + y;
};
int a = block1(32, 34);  // block的使?和函數指針的使用類似
NSLog(@“%d”, a);  // 打印結果:66

Block進?typedef

typedef int (^BlockType)(int x, int y)

原類型:int (^)(int x, int y)

新類型:BlockType

/* Block typedef */
typedef int(^blockType)(int, int);

blockType block1 = ^(int x, int y) {
            return x + y;
        };
NSLog(@%d, block1(3, 5));

Block寫法

int (^block1)(int x, int y) = ^(int x, int y) {
  return x + y;
};
BlockType block1 = ^(int x, int y) {
  return x + y;
};

上述兩種實現是等價的。

Blcok與局部變量和全局變量

        /* main函數外定義的全局變量 */
        int n = 100;

        /* 知識點4 Block與局部變量 全局變量 */
        /* 局部變量 */
        int a = 100;

        int (^block)() = ^() {
            return a;
        };
        NSLog(@%d, block());

        int (^block2)() = ^() {
//            a = 200;
            return a;
        };
        /* 總結: 默認情況下, block可以訪問但不能更改局部變量 */

        __block int b = 200;
        int (^block3)() = ^() {
            b = 300;
            return b;
        };
        NSLog(@%d, block3());
        /* 總結: 用__block修飾的局部變量, Block裡面可以更改值 */


        /* Block 與全局變量 */

        int (^block4)() = ^() {
            n = 200;
            return n;
        };
        NSLog(@n = %d, block4());

        static int num = 1;
        int (^block5)() = ^() {
            num = 8;
            return num;
        };
        NSLog(@num = %d, block5());

 

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