A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 四季列车 中级黑马   /  2014-3-17 13:16  /  1152 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

函数指针和oc里面block长得好像差不多呀,但是都不太明白,再结合typedef,再将他们作为函数参数,更加晕了,求大神指导一下

1 个回复

倒序浏览
  1. #import <Foundation/Foundation.h>

  2. int sum(int a, int b){
  3.     return a+b;
  4. }
  5. // p是一个指向函数的指针,p指向的函数具有两个int类型的参数,返回值为int类型
  6. int (*p)(int a,int b);

  7. // typedef可以自定义数据类型
  8. // 定义一个类型P:表示指向函数的指针
  9. typedef int (*P)(int a, int b);

  10. // 定义了一个数据类型MyBlock 表示一个具有int类型返回值,两个int类型参数的block类型
  11. typedef int(^MyBlock)(int a,int b);

  12. int main()
  13. {   
  14.     // 将指针p指向函数sum
  15.     p = sum;
  16.     //向p指向的函数内传递参数1,2 获取函数返回值,结果是3  相当于sum(1,2);
  17.     p(1,2);
  18.    
  19.     // sumBlock是一个block类型的数据
  20.     int (^sumBlock)(int a,int b);
  21.     // sumBlock 内封装的代码是 return a+b;
  22.     sumBlock = ^(int a,int b){
  23.         return a+b;
  24.     };
  25.     // 调用sumBlock得到 return a+b;  的值,  等于3
  26.     sumBlock(1,2);
  27.    
  28.    
  29.    
  30.     // P p1就等于int(*p1)(inta,int b)
  31.     P p1 = sum;
  32.    
  33.     p1(1,2);
  34.    
  35.     // 定义一个MyBlock类型的变量b1 相当于 int (^b1)(int a,int b)
  36.     MyBlock b1 = ^(int a,int b){
  37.         return a+b;
  38.     };

  39.     b1(1,2);
  40.    
  41.     NSLog(@"p = %d,sumBlock = %d,p1 = %d,b1 = %d",p(1,2),sumBlock(1,2),p1(1,2),b1(1,2));

  42.     return 0;
  43. }
复制代码


需要注意的就是在block封装的代码块内可以访问代码块外面的变量,但是不能修改外面的局部变量。如果需要修改某局部变量,则要给该变量前面加上__block关键字:如 __block int c = 3; 这里下划线是双下划线
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马