Block 是一种数据类型,用来存代码--用来保存一段代码,想用代码的时候就调用这段代码
使用场景:
1. 动画
2. 多线程
3. 集合遍历
4. 网络请求回调
区别于函数:
函数也是用来保存一段代码的,当调用函数的时候才会执行里面的代码.
但是函数不能在程序运行的时候再在指定的位置执行代码.
1. 没参数也没返回值的Block
void (^gm)() = ^{NSLog(@"........");}; //gm是Block变量的变量名,用来保存这一段代码{NSLog(@"........");}
gm(); //执行Block代码
2. 有参数没有返回值的Block
void (^gm)(int) = ^(int count){ for (int i = 0; i < count ;i++) NSLog(@"...");};//打印指定行数的...
gm(5);
3. 有参数也有返回值的Block
int (^sum)(int ,int ) = ^(int a, int b){return a+b ;};//求两个数的和
int c = sum(2,3);
typedef
typedef 旧 新 ;//用来简化类型的名称 . 用typedef 给Block的类型 定义一个别名;
1. typedef int(^MyBlock)(int, int); //Myblock <=> int(^) (int, int);
2. MyBlock minus = ^ (int a,int b){return a-b};
等价于1,2 (int) (^minus)(int ,int ) = ^(int a,int b){renturn a-b;};
block 的使用场景:
当一个函数的的代码的前边和后边的代码都一样,就是中间的代码有区别.可以将中间的代码封装成Block的代码,作为函数的参数.每次调用函数的时候,动态的将代码传进去.
Block不能传空nil,会造成坏访问.需要加上判断.
void gotWork(void (^work))
{
NSLog(@"begin");
if (work != nil) //**
{
work();
}
NSLog(@"end");
}
Block 调用外部的变量:
1. Block能访问外部的变量
2. 默认情况下,Block里面不能修改外面的局部变量
如果要修改可以在 外部的变量前加 __block