——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
Block:
Block对象是一个C级别的语法和运行机制。
由于Objective-C 和 C++ 都是衍生自 C,block被设计为可同时兼容这三种语言。
定义格式:
void(^block名)() = ^{代码块;}
使用格式:
block名();
block可以分为:无参无返回值、无参有返回值、有参无返回值、有参有返回值
当block作为返回值:
<span style="font-size:24px;">#import <Foundation/Foundation.h>
typedef void (^newType)();
newType test1 () {
newType w1 = ^{
NSLog(@"XXXXX");
NSLog(@"Good");};
return w1;
}
typedef int (^bestType2)(int a,int b);
bestType2 test2(){
return ^(int a,int b){
return a+b;
};
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
newType n1 = test1();
n1();
bestType2 n2 = test2();
int x = n2(45,76);
NSLog(@"x = %d",x);
}
return 0;
}</span>
运行结果:xxxxx
Good
x = 121
block类型作为返回值,可以参考函数作为返回值进行理解
实例分析:用block传递程序员的一天
/*
起床
刷牙
去车站
坐车
了解项目
去车站
坐车回家
吃饭
睡觉
*/
#import <Foundation/Foundation.h>
//workBlock作为参数
void work(void (^workBlock)()){
NSLog(@"起床");
NSLog(@"刷牙");
NSLog(@"去车站");
NSLog(@"坐车");
workBlock(); //此处是代码段插入的位置
NSLog(@"去车站");
NSLog(@"坐车回家");
NSLog(@"吃饭");
NSLog(@"睡觉");
}
typedef void (^workBlock)();
workBlock w;
void workDay(int n){
switch (n) {
case 1:
w = ^{
NSLog(@"了解项目");
};
break;
// work(^ {
// NSLog(@"了解项目");
// });
// break;
case 2:
w = ^ {
NSLog(@"分析项目");
};
break;
// work(^ {
// NSLog(@"分析项目");
// });
// break;
case 3:
w = ^ {
NSLog(@"写项目");
};
break;
// work(^ {
// NSLog(@"写项目");
// });
// break;
case 4:
w = ^ {
NSLog(@"调试项目");
};
break;
// work(^ {
// NSLog(@"调试项目");
// });
// break;
case 5:
w = ^ {
NSLog(@"离职");
};
break;
// work(^ {
// NSLog(@"离职");
// });
// break;
default:
break;
}
work(w);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
for (int i=1; i<=5; i++) {
workDay(i);
NSLog(@"---------------");
NSLog(@"---------------");
}
}
return 0;
}
运行结果:
起床
刷牙
去车站
坐车
了解项目
去车站
坐车回家
吃饭
睡觉
---------------
---------------
起床
刷牙
去车站
坐车
分析项目
去车站
坐车回家
吃饭
睡觉
---------------
---------------
起床
刷牙
去车站
坐车
写项目
去车站
坐车回家
吃饭
睡觉
---------------
---------------
起床
刷牙
去车站
坐车
测试项目
去车站
坐车回家
吃饭
睡觉
---------------
---------------
起床
刷牙
去车站
坐车
离职
去车站
坐车回家
吃饭
睡觉
---------------
---------------
注释内的内容是另一种写法,直接插入代码段就可以,不用每次调用work函数。