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 @   星语海蓝  Views(1564)  Comments(0Edit  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
历史上的今天:
2013-01-04 指针与字符串
2013-01-04 使用TinyXml库值得注意的几个地方
点击右上角即可分享
微信分享提示