1.什么是Block
Block是iOS中一种比较特殊的数据类型
- Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛
- 动画
- 多线程
- 集合遍历
- 网络请求回调
- Block的作用
- 用来保存某一段代码, 可以在恰当的时间再取出来调用
- 功能类似于函数和方法
2.block的格式
- Block的定义格式
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
};
- block最简单形式
void (^block名)() = ^{代码块;}
例如:
void (^myBlock)() = ^{ NSLog(@"Test!"); };
- block带有参数的block的定义和使用
void (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }
例如:
void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };
- 带有参数和返回值的block
返回类型 (^block名称)(参数列表)
= ^ (参数列表) { // 代码实现; }
例如:
int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };
- 调用Block保存的代码
block变量名(实参);
- block与typedef
typedef int(^calculateBock)(int, int)
int main(int argc, const char * argv[]) {
//1.直接定义
int (^sumBlock) (int, int) = ^(int value1, int value2){
return value1 + value2;
};
int res = sumBlock(10 , 20);
NSLog(@"res = %i", res);
//使用typedef
calculateBlock sumBlock = ^(int value1, int value2){
return value1 + value2;
};
int res = sumBlock(10, 20);
NSLog(@"res = %i", res);
return 0;
//如果是直接定义,则(^sumBlock)中的sumBlock就是函数名
//如果是使用typedef定义,(^calculateBock)中的calculateBock是一种数据类型,需要使用它去创建一个这样的Block函数
//calculateBlock sumBlock =...;则其中sumBlock就是函数名
}
3.Block注意事项
- 在block内部可以访问block外部的变量
int a = 10;
void (^myBlock)() = ^{
NSLog(@"a = %i", a);
}
myBlock();
输出结果: 10
- block内部也可以定义和block外部的同名的变量(局部变量),此时局部变量会暂时屏蔽外部
int a = 10;
void (^myBlock)() = ^{
int a = 50;
NSLog(@"a = %i", a);
}
myBlock();
输出结果: 50
- 默认情况下, Block内部不能修改外面的局部变量
int b = 5;
void (^myBlock)() = ^{
b = 20; // 报错
NSLog(@"b = %i", b);
};
myBlock();
- Block内部可以修改使用__block修饰的局部变量
__block int b = 5;
void (^myBlock)() = ^{
b = 20;
NSLog(@"b = %i", b);
};
myBlock();
输出结果: 20