先了解定义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 }
如果按照以上代码, 第一个打印会报错!! 因为对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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
原文链接:http://www.jianshu.com/p/abb1eafeb068
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。