block类型的变量的声明
虽然block类型的变量是用来存储1断代码的.
但是1个block类型的变量并不是任意的代码段都可以存储的 而是有限定的.
在声明block变量的时候,必须要指定这个block变量存储的代码的返回值类型是什么,参数是什么.
- 一旦指定. 那么这个block变量中就只能存储这种类型的代码段.
. 在声明block变量的时候,必须要指定这个block可以存储的代码段的返回值类型和参数.
声明block变量的语法:
- 返回值类型 (^block变量名)(参数列表);
void (^myBlock)();
- 表示声明了1个block类型的变量 变量名叫做myBlock
- 这个myBlock变量只能存储无返回值无参数的代码段.
void (^myBlock1)(int num1,int num2);
- 表示声明了1个block类型的变量叫做myBlock1
- 这个myBlock1变量之中可以存储无返回值 带两个int类型的参数的代码段.
int (^myBlock2)(int num1,int num2);
. 虽然语法看起来相当怪异,但是这是固定的.
block变量在声明的时候 要指定这个变量存储的代码段的返回值 和 参数
返回值类型 (^block变量名)(参数列表);
block变量的初始化
. 为block类型的变量赋值很简单. 只需要将符合要求的代码段赋值给block变量.
- 我们的代码段的返回值和参数要和block变量的要求一致.
. 如何写1个符合要求的代码段.
语法:
^返回值类型(参数列表){
代码;
};- 无参数无返回值的代码段.
^void(){
NSLog(@"呵呵1");
NSLog(@"随便2");
};
- 完全可以将这个代码段通过赋值符号存储到符合要求的block变量之中.
void (^myBlock1)();
myBlock1 = ^void(){
NSLog(@"呵呵1");
NSLog(@"随便2");
};
当然完全可以在声明block变量的同时直接赋值.
- 无返回值,有参数的代码段的书写.
^void(int num1,int num2){
int num3 = nim1 + num2;
NSLog(@"num3 = %d",num3);
};
void (^myBlock2)(int num1,int num2) = ^void(int num1,int num2){
int num3 = nim1 + num2;
NSLog(@"num3 = %d",num3);
};
- 有返回值 有参数的代码段的书写.
^int(int num1,int num2){
int num3 = num1 + num2;
return num3;
};
int (^myBlock3)(int num1,int num2) = ^int(int num1,int num2){
int num3 = num1 + num2;
return num3;
};
- 为block变量赋值代码段的时候,代码段必须符合block变量的返回值和参数的要求.
- 否则就会报错.
执行存储在block类型变量中的代码
. block变量中存储的是1段符合要求的代码.
- 我们可以执行存储在block变量中的代码.
. 如何执行?
block变量名();
如果存储在block变量中的代码段有参数,那么给参数就可以了.
- 如果有返回值,使用1个相应类型的变量接收返回值就可以了.
使用block注意小点
- . 如果代码段没有参数. 那么代码段可以省略表示参数列表的小括弧.
void (^myBlock)() = ^void{
NSLog(@"呵呵");
};
- . 如果声明block变量的时候,要求代码块带参数. 那么在声明block变量的时候.
- 可以只写参数类型,省略参数名称.
- 但是代码段是必须要写参数名字的.
void (^myBlock)(int,int) = ^void(int num1,int num2){
NSLog(@"%d + %d = %d",num1,num2,num1+num2);
};
- . 代码段的返回值类型可以省略.
int (^myBlock)(int,int) = ^(int num1,int num2){
return num1 + num2;
};
- 如果代码段没有指定返回类型. 那么这个代码段的返回值类型就是return回去的数据的类型.
- 如果没有return 那么这个代码段就的返回值就是void.
void (^block1)() = ^{
.....
};
使用typedef将复杂的block定义简化
.遇到的问题.
- 如果我们希望定义1个无返回值无参数的block变量.
- void (^myBlock1)();
- 如果再希望定义1个呢?
- void (^myBlock2)();
- 如果再希望定义1个呢?
- void (^myBlock2)();
………..
- 你有没有发现,每次定义block变量要使用好长的1段代码,忒麻烦.
- 如果我们希望定义1个无返回值无参数的block变量.
.我们学习过typedef 给已经存在的类型取1个别名.
- 我们可以为1个指定要求的block取1个短别名. 然后使用这个别名声明多个要求一致的block变量.
typedef void (^newType)();
- 代表为返回值为void 并且没有参数的block类型 定义了1个别名叫做newType.
- 如果我们想声明1个没有返回值并且参数的block.直接使用别名newType就可以定义.
- 比如:
newType myBlock;
首先,myBlock是1个变量.1个block类型的变量.这个变量要求存储的代码段无返回值并且没有参数.
- 所以,可以像下面这样初始化.
myBlock = ^{
NSLog(@"呵呵");
};
- 调用按原来的就方式就可以调用.
myBlock();
举例
typedef int (^newType)(int,int);
代表为返回值为int类型,参数有两个int类型的参数的block类型 定义了1个别名叫做newType.
- 如果我们要声明1个返回值为int,并且参数是两个int类型的block变量的时候,
- 就可以使用newType来直接简单声明
newType sumBlock = ^(int num1,int num2){
return num1 + num2;
};
- 调用block
int sum = sumBlock(10,20);
block访问外部变量
. 默认情况下,block内部可以取外部的变量的值.
- 但是无法修改外部变量的值.
可以修改全局变量,但是无法修改外部的局部变量.
- . 如果允许外部变量的值在block内部可以被修改,那么就将外部变量使用__block修饰.