OC-Block语法

block 语法

block语法 -> 块语法
标准C里面没有Block, C语言的后期扩展版本, 加入了匿名函数; C++, JS, Swift等语言中, 有类似语法, 叫做闭包!

block语法和函数指针很相似

回顾, C语言中的指针函数:int(*) (int x, int y) 即: 指向两个整型参数, 一个整型返回值函数的指针!

Block函数, 没有名称的函数;
例如 int(int x, int y)
因为Block是匿名函数, block变量的存放的函数的实现, 通过block变量能直接调用函数, 没有名称的函数该如何调用呢? (有名称的话, 可以直接调用, 也可以通过函数指针来调用)

例如定义C语言的函数指针!

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

// 函数指针类型: int (*)(int, int);
// 函数指针变量: p;
// 函数指针的值: 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));

效果和上边的函数指针一样! 参照起来学习方便!

  • 无返回值, 无参数 block 语法

      void(^block1)(void) = ^(void) {
      NSLog(@"无返回值, 无参数");
      }  
      // 调用block1
      block1();
    
  • 有返回值, 无参数
    int(^block2)(void) = ^(void) {
    return 1;
    }
    NSLog(@”有返回值, 无参数%d”, block2());

  • 无返回值, 有参数
    void (^block3)(int, int) = ^(int x, int y){
    NSLog(@”%d + %d = %d”, x, y, x +y);
    };
    调用
    block3(3, 5);

  • 有返回值, 有参数
    int (^block4)(int , int) = ^(int x, int y) {
    return x + y;
    }
    block 调用
    NSLog(@”%d”, block4(3, 5));

block 与变量的关系
  • block 与 局部变量的关系
    int temp = 100;
    void (^block1)(void) = ^(void) {
    NSLog(@”%d”, temp++);
    NSLog(@”%d”, temp + 1);
    }
    调用 block1();
    如果按照以上代码, 第一个打印会报错!! 因为对temp进行了操作, 也就是说在block中是不能修改局部变量的值的! 而第二个打印却不会报错, 说明block中可以调用局部变量! 那怎样才能在block中修改局部变量的值呢?
    __block int temp2 = 200; 用__block修饰一下变量, 便在block可以使用了
    __block int temp2 = 200;
    void (^block9) (void) = ^(void){
    temp2++; // 这样就可以修改了!
    };
    调用 block9();
    结果 201;
  • block与全局变量.
    在main函数外定义一个在main函数外定义一个temp3 = 300;
    void (^block11) (void) = ^(void){
    temp3++;
    NSLog(@”temp3 = %d”, temp3 + 1);
    };
    调用 block11();
    结果 temp3 = 301;
    说明block中可以修改全局变量!

block 用户熟练了, 用处大大的!!!

    原文作者:李小六_
    原文地址: https://www.jianshu.com/p/abb1eafeb068
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞