黑马程序员技术交流社区
标题:
学习OC-block总结
[打印本页]
作者:
泥娃娃
时间:
2016-3-18 16:57
标题:
学习OC-block总结
本帖最后由 泥娃娃 于 2016-3-18 17:00 编辑
block的简单用法
1,block的基本用法:
1) block最简单形式 :
定义格式:
void (^block名)() = ^{代码块;}
使用格式:
block名();
例如:
定义一个block:
void (^myBlock)() = ^ {
NSLog(@"hello");
};
调用block:
myBlock();
2),带有参数的block的定义和使用:
定义格式:
void (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }
例如:
//定义有参数的block
void (^sumBlock)(int, int) = ^ (int x, int y) {
NSLog(@"%d", x + y);
};
//调用block
sumBlock(10, 20);
3),带有参数和返回值的block
定义格式:
返回类型 (^block名称)(参数列表)
= ^ 返回类型 (参数列表) { // 代码实现; }
例如:
//定义有返回值和参数的block
int (^sumBlock2)(int, int) = ^ int (int a, int b) {
return a + b;
};
//调用有返回值的block
NSLog(@"%d", sumBlock2(4, 8));
typedef 在block中的使用:
1,函数指针回顾:
typedef int (*NewType)(int x,int y);
NewType f1,f2,f3; //f1实际类型 int (*f1)(int x,int y);
2,block的typedef
格式:
typedef 返回值类型 (^block变量名)(参数类型列表);
例如:
typedef void (^newType)();
//用新的类型定义block变量
newType t1;
t1 = ^{
NSLog(@"我是使用newType定义出来的变量t1的值");
};
//使用block
t1();
block访问外部变量:
1,在block内部可以访问block外部的局部变量;当定义block的时候,block会把外部变量以const的方式复制一份,存放到block的所在的内存中.
void test(){
int m = 10;
void (^myBlock)()=^{
//block会把外部变量m 以const的方式复制一份,到自己的内存中,并且不能修改
};
}
2,默认情况下,block内部不能修改外部的局部变量;如果非要修改,给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改。
void test(){
__block int m = 10;
void (^myBlock)()=^{
//如果非要在这里修改m的值,需要给m加上__block关键字
m = 100;
//这样可以理解为,block不在以const的方式拷贝m的变量到自己的内存中
};
}
3,如果在block中将m的值改变了之后,后面在使用m的时候,使用的都是block中的m;
block作为函数的返回值;
1,使用typedef定义一个新的类型;
typedef int(^newType2)(int ,int );
2, 用新定义的类型作为函数的返回值
newType2 test2(){
//返回一个特殊的"值" 这个值是一个有返回值,有两个参数的的代码块
return ^(int a,int b){
return a+b;
};
}
3,定义block变量接收 函数返回的结果
newType2 n2 = test2();
4,执行block
int s = n2(23,12);
NSLog(@"s = %d",s);
block的使用技巧:
1,inlineBlock block助记符;
2,自定义代码块;
3,声明标准的block代码;
block的应用
#import
//void (^workBlock)()
// block类型的变量 workBlock
// 作为函数的参数
void work(void (^workBlock)()){//int a
NSLog(@"起床");
NSLog(@"刷牙");
NSLog(@"去车站");
NSLog(@"坐车");
// NSLog(@"了解项目"); //思考: 把这句话作为参数传递过来
workBlock();
NSLog(@"去车站");
NSLog(@"坐车回家");
NSLog(@"吃饭");
NSLog(@"睡觉");
}
//每天做什么事情
void workDay(int n){
// 定义别名
typedef void (^workBlock) ();
workBlock w; //w是变量
switch(n) {
case 1:
w =^{
NSLog(@"----->了解项目");
};
break;
case2:
w = ^{
NSLog(@"----->分析项目");
};
break;
case3:
w = ^{
NSLog(@"----->写项目");
};
break;
case4:
w = ^{
NSLog(@"----->调试项目");
};
break;
case 5:
w = ^{
NSLog(@"----->离职");
};
break;
default:
break;
}
//调用work函数
work(w);
}
//void day1(){
// NSLog(@"起床");
// NSLog(@"刷牙");
// NSLog(@"去车站");
// NSLog(@"坐车");
// NSLog(@"了解项目");
// NSLog(@"去车站");
// NSLog(@"坐车回家");
// NSLog(@"吃饭");
// NSLog(@"睡觉");
//}
//void day2(){
// NSLog(@"起床");
// NSLog(@"刷牙");
// NSLog(@"去车站");
// NSLog(@"坐车");
// NSLog(@"分析项目");
// NSLog(@"去车站");
// NSLog(@"坐车回家");
// NSLog(@"吃饭");
// NSLog(@"睡觉");
//}
//void day3(){
// NSLog(@"起床");
// NSLog(@"刷牙");
// NSLog(@"去车站");
// NSLog(@"坐车");
// NSLog(@"写代码");
// NSLog(@"去车站");
// NSLog(@"坐车回家");
// NSLog(@"吃饭");
// NSLog(@"睡觉");
//}
//void day4(){
// NSLog(@"起床");
// NSLog(@"刷牙");
// NSLog(@"去车站");
// NSLog(@"坐车");
// NSLog(@"调试程序");
// NSLog(@"去车站");
// NSLog(@"坐车回家");
// NSLog(@"吃饭");
// NSLog(@"睡觉");
//}
//void day5(){
// NSLog(@"起床");
// NSLog(@"刷牙");
// NSLog(@"去车站");
// NSLog(@"坐车");
// NSLog(@"离职");
// NSLog(@"去车站");
// NSLog(@"坐车回家");
// NSLog(@"吃饭");
// NSLog(@"睡觉");
//}
intmain(intargc, constchar* argv[]) {
@autoreleasepool {
// day1();
// day2();
// day3();
// day4();
// day5();
for (int i=1; i<=5; i++) {
workDay(i);
}
}
return 0;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2