Object C中Block用法

先了解定义C语言的函数指针!

 1 int sum (int x, int y) {
 2 return x+ y;
 3 }
 4 // 定义函数
 5 int (*p)(int, int) = sum;
 6 NSLog(@"%ld", p(2, 5));
 7 
 8 // 函数指针类型: int (*)(int, int);
 9 // 函数指针变量: p;
10 // 函数指针的值: sum

 

看看block语法

1  block类型: int(^)(int, int)  
2  block变量: block
3  block值: ^(int x, int y){ 
4   return x + y ;
5 };

 

定义block语法块

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

 

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

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

    1 void(^block1)(void) = ^(void) {
    2   NSLog(@"无返回值, 无参数");
    3   }  
    4   // 调用block1
    5   block1();

     

  • 有返回值, 无参数
    1 int(^block2)(void) = ^(void) {
    2   return 1;
    3   }
    4   NSLog(@"有返回值, 无参数%d",  block2());

     

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

     

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

     

block 与变量的关系
  • block 与 局部变量的关系
    1 int temp = 100;
    2 void (^block1)(void) = ^(void) {
    3 NSLog(@"%d", temp++);
    4 NSLog(@"%d", temp + 1);
    5 }

     

    调用 block1();
    如果按照以上代码, 第一个打印会报错!! 因为对temp进行了操作, 也就是说在block中是不能修改局部变量的值的! 而第二个打印却不会报错, 说明block中可以调用局部变量! 那怎样才能在block中修改局部变量的值呢?
    1 __block int temp2 = 200; 用__block修饰一下变量, 便在block可以使用了
    2 __block int temp2 = 200;
    3 void (^block9) (void) = ^(void){
    4   temp2++; // 这样就可以修改了! 
    5   };
    6  调用 block9();  
    7  结果 201;

     

  • block与全局变量.
    1 在main函数外定义一个在main函数外定义一个temp3 = 300;
    2 void (^block11) (void) = ^(void){
    3  temp3++;
    4  NSLog(@"temp3 = %d", temp3 + 1);
    5 };    
    6 调用 block11();
    7 结果 temp3 = 301;

     


    说明block中可以修改全局变量!



文/安静的等待(简书作者)
原文链接:http://www.jianshu.com/p/abb1eafeb068
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
posted @ 2017-01-04 11:13  星语海蓝  Views(1562)  Comments(0Edit  收藏  举报