黑马程序员---OC学习笔记之block的使用场景

------Java培训、Android培训、iOS培训、.Net培训--------

一、block的使用场景:作为函数参数

【场景】

加入一个程序员每天生活是一个固定的流程

day01

起床---》刷牙--》去车站--》坐车---》到公司--》【分析项目】--》去车站---》坐车--》回家--》吃饭---》睡觉

day02

起床---》刷牙--》去车站--》坐车---》到公司--》【需求设计】--》去车站---》坐车--》回家--》吃饭---》睡觉

day03

起床---》刷牙--》去车站--》坐车---》到公司--》【写代码--》去车站---》坐车--》回家--》吃饭---》睡觉

 

 

等等,只有中间的那个是变化的,其他的都是固定的项目。

那么经过分析可以使用block。

 

【常规做法】使用三个函数,一个函数打印一天的流程【繁琐】

例如,下面的代码要写五次

void work(){
    //day01
    NSLog(@"起床");
    NSLog(@"刷牙");
    NSLog(@"去车站");
    NSLog(@"坐车");
    NSLog(@"到公司");
    NSLog(@"分析项目");//《------只有这货是改变的
    NSLog(@"去车站");
    NSLog(@"坐车");
    NSLog(@"回家");
    NSLog(@"吃饭");
    NSLog(@"睡觉");
}


【分析】其实只有中间的那一句是改变的,所以可以把它写成一个block变量传递进来

例如:

//void(^workBlock)()
//block类型作为函数的参数
void work(void(^workBlock)()){
    //day01
    NSLog(@"起床");
    NSLog(@"刷牙");
    NSLog(@"去车站");
    NSLog(@"坐车");
    NSLog(@"到公司");
    //NSLog(@"分析项目");//这个过程有可能需要很多句代码。所以可以使用block变量传递进来
   workBlock();
    NSLog(@"去车站");
    NSLog(@"坐车");
    NSLog(@"回家");
    NSLog(@"吃饭");
    NSLog(@"睡觉");
}
 
void workDay(int day){
   
    //定义一个block的别名
    typedef void (^Block)();
    Block b;
   
    switch (day) {
        case 1:
           b = ^{
               NSLog(@"分析项目");
           };
            break;
        case 2:
           b = ^{
               NSLog(@"需求分析");
           };
            break;
        case 3:
           b = ^{
               NSLog(@"写代码");
           };
            break;
        case 4:
           b = ^{
               NSLog(@"调试代码");
           };
            break;
        default:
           b = ^{
               NSLog(@"离职");
           };
            break;
   }
    work(b);
}
 
int main(int argc, const char * argv[])
{
 
    for (int i = 1; i < 6; i++) {
        NSLog(@"day%02d",i);
        workDay(i);
   }
   
    return 0;
}

【打印结果 ( 部分 )

2015-10-07 15:58:40.900 block应用场景[1462:303] day01

2015-10-07 15:58:40.902 block应用场景[1462:303] 起床

2015-10-07 15:58:40.903 block应用场景[1462:303] 刷牙

2015-10-07 15:58:40.903 block应用场景[1462:303] 去车站

2015-10-07 15:58:40.904 block应用场景[1462:303] 坐车

2015-10-07 15:58:40.904 block应用场景[1462:303] 到公司

2015-10-07 15:58:40.905 block应用场景[1462:303] 分析项目

2015-10-07 15:58:40.905 block应用场景[1462:303] 去车站

2015-10-07 15:58:40.906 block应用场景[1462:303] 坐车

2015-10-07 15:58:40.906 block应用场景[1462:303] 回家

2015-10-07 15:58:40.907 block应用场景[1462:303] 吃饭

2015-10-07 15:58:40.907 block应用场景[1462:303] 睡觉


二、block作为函数的返回值


block作为函数的返回值,需要用typedef定义一个别名

例如:

#import 
//返回值是block
//1.1、定义一个新的block类型--无返回值
typedef void (^newBlockType)();
//1.2、定义一个新的block类型--有返回值
typedef int (^newBlockType2)(int ,int);
 
newBlockType2 test2(){
    newBlockType2 nt = ^(int a, int b){
        return a + b;
   };
    return nt;
}
 
newBlockType test(){
    newBlockType nt = ^{
        NSLog(@"返回值为block类型");
        NSLog(@"我是叶良辰,爱好是女人");
   };
    return nt;
}
 
int main(int argc, const char * argv[])
{
 
    //定义一个block变量
    newBlockType nt = test();
    newBlockType2 nt2 = test2();
    //执行block
   nt();
    NSLog(@"a + b = %d",nt2(2,4));
   
    return 0;
}


打印结果:

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

 


你可能感兴趣的:(Objective-C基础)