OC-Block语法

作者: 李小六_ | 来源:发表于2015-05-11 11:20 被阅读4545次
    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 用户熟练了, 用处大大的!!!

    相关文章

      网友评论

      • 上帝也是码农:例子中的block,后面应该有分号结尾的
      • 小白yzq:程序猿?😱好深奥,理解无能。你现在在实习么?还是

      本文标题:OC-Block语法

      本文链接:https://www.haomeiwen.com/subject/nzsxqttx.html