iOS_Blocks
用一句话来表示Block:带有自动变量(局部变量)的匿名函数
语法
返回值类型 (^block名称) (参数列表) 表达式>
(1)没有函数名
(2)带有”^”
(3)返回值类型可省略:如果表达之中含有return语句,使用返回值类型,如果没有,使用void类型.例:
int (^count){return count + 1}; //返回值为int类型
void (^void){printf("blocks\n")};//可省略为如下
^ {printf("blocks\n")};//参数列表(为空时)也可省略
Block类型变量
(1)block类型变量和一般的C语言变量完全不同,可作为局部变量,函数参数,静态变量和全局变量来使用.
(2)typedef声明block变量
typedef int (^blcok_t)(int); //typedef 返回值 (^block名)(参数)
(3)Block截获自动变量值
int day = 256;
int val = 10;
const char *fmt = "val = %d\n";
void (^blk)(void) = ^
{
printf(fat,val);
}
val = 2;
fat = "these values were changed.val = %d\n";
blk();//该段代码的执行结果为 val = 10
//block 可以截获自动变量的值并保存,在block代码块中使用.
__block说明符
block截获并保存自动变量的值,但是保存之后无法修改,如果需要在block表达式中修改自动变量的值,需要给自动变量附加__block说明符.例:
__block int val = 0;
void (^blk)(void) = ^
{
val = 1;//修改变量值(不加__block会发生编译错误)
}
blk();
print("val = %d\n",val);//结果为 val = 1;