OC-Block語法

block 語法

block語法 -> 塊語法
標(biāo)準(zhǔn)C里面沒有Block, C語言的后期擴展版本, 加入了匿名函數(shù); C++, JS, Swift等語言中, 有類似語法, 叫做閉包!

block語法和函數(shù)指針很相似

回顧, C語言中的指針函數(shù):int(*) (int x, int y) 即: 指向兩個整型參數(shù), 一個整型返回值函數(shù)的指針!

Block函數(shù), 沒有名稱的函數(shù);
例如 int(int x, int y)
因為Block是匿名函數(shù), block變量的存放的函數(shù)的實現(xiàn), 通過block變量能直接調(diào)用函數(shù), 沒有名稱的函數(shù)該如何調(diào)用呢? (有名稱的話, 可以直接調(diào)用, 也可以通過函數(shù)指針來調(diào)用)

例如定義C語言的函數(shù)指針!

int sum (int x, int y) {
return x+ y;
}
// 定義函數(shù)
int (*p)(int, int) = sum;
NSLog(@"%ld", p(2, 5));

// 函數(shù)指針類型: int (*)(int, int);
// 函數(shù)指針變量: p;
// 函數(shù)指針的值: sum 

看看block語法

 block類型: int(^)(int, int)  
 block變量: block
 block值: ^(int x, int y){ 
  return x + y ;
};

定義block語法塊

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

效果和上邊的函數(shù)指針一樣! 參照起來學(xué)習(xí)方便!

  • 無返回值, 無參數(shù) block 語法

      void(^block1)(void) = ^(void) {
      NSLog(@"無返回值, 無參數(shù)");
      }  
      // 調(diào)用block1
      block1();
    
  • 有返回值, 無參數(shù)
    int(^block2)(void) = ^(void) {
    return 1;
    }
    NSLog(@"有返回值, 無參數(shù)%d", block2());

  • 無返回值, 有參數(shù)
    void (^block3)(int, int) = ^(int x, int y){
    NSLog(@"%d + %d = %d", x, y, x +y);
    };
    調(diào)用
    block3(3, 5);

  • 有返回值, 有參數(shù)
    int (^block4)(int , int) = ^(int x, int y) {
    return x + y;
    }
    block 調(diào)用
    NSLog(@"%d", block4(3, 5));

block 與變量的關(guān)系
  • block 與 局部變量的關(guān)系
    int temp = 100;
    void (^block1)(void) = ^(void) {
    NSLog(@"%d", temp++);
    NSLog(@"%d", temp + 1);
    }
    調(diào)用 block1();
    如果按照以上代碼, 第一個打印會報錯!! 因為對temp進行了操作, 也就是說在block中是不能修改局部變量的值的! 而第二個打印卻不會報錯, 說明block中可以調(diào)用局部變量! 那怎樣才能在block中修改局部變量的值呢?
    __block int temp2 = 200; 用__block修飾一下變量, 便在block可以使用了
    __block int temp2 = 200;
    void (^block9) (void) = ^(void){
    temp2++; // 這樣就可以修改了!
    };
    調(diào)用 block9();
    結(jié)果 201;
  • block與全局變量.
    在main函數(shù)外定義一個在main函數(shù)外定義一個temp3 = 300;
    void (^block11) (void) = ^(void){
    temp3++;
    NSLog(@"temp3 = %d", temp3 + 1);
    };
    調(diào)用 block11();
    結(jié)果 temp3 = 301;
    說明block中可以修改全局變量!

block 用戶熟練了, 用處大大的!!!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容