/* 总结: block是一种数据类型:
block用来保存一段代码
block标志 ^
block和函数很像:
1> 可以保存一段代码
2> 有返回值
3> 有形参
4> 调用方式和函数一样
掌握:
1.定义block变量
void (^myBlock2)();
int (^sumBlock)(int, int);
2.利用block封装代码
^() {
NSLog(@"------");
};
^ {
NSLog(@"------");
};
^(int a,int b) {
return a + b;
};
3.block访问外面变量
* block内部可以访问外面的变量
* 默认情况下,block内部不能修改外面的局部变量
* 给局部变量加上__block关键字,这个局部变量就可以在block内部修改、访问
4.利用typedef定义block类型,类型名大写开头
typedef int(^MyBlock)(int, int); // 以后就可以用MyBlock这种类型定义block变量
MyBlock b;
MyBlock b1, b2;
b = ^(int a,int b) {
return a + b;
};
MyBlock b3 = ^(int a,int b) {
return a + b;
};
*/
// block基本使用
void baseUseBlock()
{
// 定义block变量myBlock;此时并不执行block里面的代码
// 无返回值,无形参
void (^myBlock)() = ^(){
NSLog(@"------");
};
void (^myBlock2)();
myBlock2 = ^(){
NSLog(@"------");
};
// 如果block没有形参,可以省略后面的()
void (^myBlock3)() = ^{
NSLog(@"------");
};
// 利用block变量myblock调用block内部的代码;执行
myBlock();
myBlock2();
myBlock3();
}
// block基本使用2
void baseUseBlock2()
{// 定义一个block类型的变量sumBlock;此时并不执行block里面的代码
// 返回int,接收2个int类型的形参
int (^sumBlock)(int, int)= ^(int a, int b){
return a + b;
};
/* 等价于
int (^sumBlock)(int, int);
sumBlock= ^(int a, int b){
return a + b;
};
// 指向函数的指针 int (*p)(int, int) = sum;
*/
NSLog(@"he is %d", sumBlock(233,23)); // 利用block变量sumBlock调用block内部的代码;执行
// 利用block输出n条横线
void (^lineBlock)(int) = ^(int n){
for (int i = 0; i < n; i++) {
NSLog(@"-------------");
}
};
lineBlock(3);
}
// block基本使用3---typedef
void baseUseBlock3()
{
typedef int(^MyBlock)(int, int); // typedef自定义新的数据类型MyBlock 类型名 大写开头
MyBlock sumBlock;
sumBlock = ^(int a,int b){
return a + b;
};
MyBlock minusBlock = ^(int a,int b){
return a - b;
};
NSLog(@"%d,%d", sumBlock(1,5), minusBlock(3,6));
}
// block基本使用4---访问外面的局部变量
void baseUseBlock4()
{
int a = 10;
__block int b = 100;
void (^myBlock)() = ^ {
// a = 1000; // 错误写法 默认情况下,block内部不能修改外面的局部变量
b = 111; // 给局部变量b加上__block关键字,这个局部变量就可以在block内部修改、访问
NSLog(@"a is %d, b is %d", a, b); // block内部可以访问外面的变量
};
myBlock();
}