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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chunhuayun 中级黑马   /  2015-10-10 08:22  /  794 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、block的使用场景:作为函数参数
【场景】
加入一个程序员每天生活是一个固定的流程
【day01】
起床---》刷牙--》去车站--》坐车---》到公司--》【分析项目】--》去车站---》坐车--》回家--》吃饭---》睡觉
【day02】
起床---》刷牙--》去车站--》坐车---》到公司--》【需求设计】--》去车站---》坐车--》回家--》吃饭---》睡觉
【day03】
起床---》刷牙--》去车站--》坐车---》到公司--》【写代码】--》去车站---》坐车--》回家--》吃饭---》睡觉


等等,只有中间的那个是变化的,其他的都是固定的项目。
那么经过分析可以使用block。

【常规做法】使用三个函数,一个函数打印一天的流程【繁琐】
例如,下面的代码要写五次
  1. void work(){
  2.     //day01
  3.     NSLog(@"起床");
  4.     NSLog(@"刷牙");
  5.     NSLog(@"去车站");
  6.     NSLog(@"坐车");
  7.     NSLog(@"到公司");
  8.     NSLog(@"分析项目");//《------只有这货是改变的
  9.     NSLog(@"去车站");
  10.     NSLog(@"坐车");
  11.     NSLog(@"回家");
  12.     NSLog(@"吃饭");
  13.     NSLog(@"睡觉");
  14. }
复制代码


【分析】其实只有中间的那一句是改变的,所以可以把它写成一个block变量传递进来
例如:
  1. //void(^workBlock)()
  2. //block类型作为函数的参数
  3. void work(void(^workBlock)()){
  4.     //day01
  5.     NSLog(@"起床");
  6.     NSLog(@"刷牙");
  7.     NSLog(@"去车站");
  8.     NSLog(@"坐车");
  9.     NSLog(@"到公司");
  10.     //NSLog(@"分析项目");//这个过程有可能需要很多句代码。所以可以使用block变量传递进来
  11.     workBlock();
  12.     NSLog(@"去车站");
  13.     NSLog(@"坐车");
  14.     NSLog(@"回家");
  15.     NSLog(@"吃饭");
  16.     NSLog(@"睡觉");
  17. }

  18. void workDay(int day){
  19.    
  20.     //定义一个block的别名
  21.     typedef void (^Block)();
  22.     Block b;
  23.    
  24.     switch (day) {
  25.         case 1:
  26.             b = ^{
  27.                 NSLog(@"分析项目");
  28.             };
  29.             break;
  30.         case 2:
  31.             b = ^{
  32.                 NSLog(@"需求分析");
  33.             };
  34.             break;
  35.         case 3:
  36.             b = ^{
  37.                 NSLog(@"写代码");
  38.             };
  39.             break;
  40.         case 4:
  41.             b = ^{
  42.                 NSLog(@"调试代码");
  43.             };
  44.             break;
  45.         default:
  46.             b = ^{
  47.                 NSLog(@"离职");
  48.             };
  49.             break;
  50.     }
  51.     work(b);
  52. }

  53. int main(int argc, const char * argv[])
  54. {

  55.     for (int i = 1; i < 6; i++) {
  56.         NSLog(@"day%02d",i);
  57.         workDay(i);
  58.     }
  59.    
  60.     return 0;
  61. }
复制代码
二、block作为函数的返回值
block作为函数的返回值,需要用typedef定义一个别名
例如:
  1. #import <Foundation/Foundation.h>
  2. //返回值是block
  3. //1.1、定义一个新的block类型--无返回值
  4. typedef void (^newBlockType)();
  5. //1.2、定义一个新的block类型--有返回值
  6. typedef int (^newBlockType2)(int ,int);

  7. newBlockType2 test2(){
  8.     newBlockType2 nt = ^(int a, int b){
  9.         return a + b;
  10.     };
  11.     return nt;
  12. }

  13. newBlockType test(){
  14.     newBlockType nt = ^{
  15.         NSLog(@"返回值为block类型");
  16.         NSLog(@"我是叶良辰,爱好是女人");
  17.     };
  18.     return nt;
  19. }

  20. int main(int argc, const char * argv[])
  21. {

  22.     //定义一个block变量
  23.     newBlockType nt = test();
  24.     newBlockType2 nt2 = test2();
  25.     //执行block
  26.     nt();
  27.     NSLog(@"a + b = %d",nt2(2,4));
  28.    
  29.     return 0;
  30. }
复制代码
打印结果:
2015-10-07 16:12:47.015 block作为函数返回值[1505:303] 返回值为block类型
2015-10-07 16:12:47.017 block作为函数返回值[1505:303] 我是叶良辰,爱好是女人
2015-10-07 16:12:47.019 block作为函数返回值[1505:303] a + b = 6


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马