------- android培训、java培训、期待与您交流!
Block 封装了一段代码,可以在任何时候执行
Block可以作为函数参数或者函数的返回值,而起本身又可以带输入参数或返回值
多用于 多线程、异步任务、集合遍历、集合排序、动画转场等
block总结:
1.>定义block变量:
int (^sumBlock)(int ,int);
void (^myBlock)();
2.>利用block封装代码
^(int a,int b){
return a - b;
}
^{
NSLog(@"");
}
3.>block访问外部变量
block 内部可以访问外面的变量
默认情况下,block内部变量不能修改外面的局部
给局部变量加上__block关键字,这个局部变量就可以在block内部修改
4.>利用typedef定义block类型
typedef int (^MyBlock)(int,int);
//test3:利用typedef 简化声明定义block
typedef int (*SumP)(int,int);
typedef int (^MyBlock)(int,int);
int sum(int a,int b){
return a+b;
}
void test4(){
SumP p = sum;
SumP p2 = sum;
MyBLock = sumBlock;
sumBlock = ^(int a,int b){
return a+b;
};
MyBlock = minusBlock(^int a,int b){
return a-b;
};
NSLog(@"%d - %d",sumBlock(10,9),minusBlock(10,5));
}
//test3:block修改外部的变量
void test3(){
int a = 10;
__block int b = 20;
void (^block)();
block=^{
//block 内部可以访问外面的变量
NSLog(@"a = %d",a);
//默认情况下,block内部变量不能修改外面的局部
a = 20;//这是不可以的
//给局部变量加上__block关键字,这个局部变量就可以在block内部修改
b = 25;
};
block();
}
//test2:有返回值,有形参的block
void test(){
int (*sumpoint)(int,int) = sum; //可以对比一下
int d = p(10,13);
int (^sumblock)(int,int)=^(int a,int b){
return a+b;
}
int c = sumblock(10,11);
NSLog(@"%d",c);
void (^lineBlock)(int) = ^(int n){
for(int i=0;i<n;i++){
NSLog(@"----------------");
}
};
lineBlock(5);//输出五条线
return 0;
}
//test1:没有返回值,没有形参的block
void test1(){
//block 用来保存一段代码
//block的标志: ^
/*
block跟函数很像:
1.可以保存代码
2.有返回值
3.有形参
4.调用方式一样
*/
//定义block变量
void (^myblock)() = ^{ /^() 可以省略括号
NSLog(@"----------");
NSLog(@"----------");
};
//利用block变量调用block内部的代码
myblock();
//int a = 10;相似
return 0;
}