一、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;
- }
复制代码二、block作为函数的返回值 block作为函数的返回值,需要用typedef定义一个别名 例如: - #import <Foundation/Foundation.h>
- //返回值是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
|