Blocks是C语言的扩充功能。 用一句话来概括就是:带有自动变量(局部变量)的匿名函数。
在其他语言中Block的名称
程序语言 Block的名称
C + Blocks Block
Smalltalk Block
Ruby Block
LISP Lambda
Python Lambda
C ++11 Lambda
Javascript Anonymous function
Blocks模式--Block语法
^ 返回值类型 参数列表 表达式
^ int (int count) {return count + 1}
^ 参数类型 表达式
^(int count) {return count + 1}
^ 表达式
^{printf("balabalabalabala");} 或者 ^ void (void) {printf("balabalabala");}
声明Block类型变量仅仅是将声明函数指针变量的“*”变为“^”。该Block函数变量与一般的C语言变量完全相同,可作为一下用途使用:
自动变量、函数参数、静态变量、静态全局变量、全局变量
如以下例子可供参考:
int (^blk) (int) = ^(int count){return count + 1}
int (^blk1) (int) = blk;
int (^blk2) (int);
blk2 = blk1;
在函数参数中使用Block类型变量可以向函数传递Block。
通常我们使用typedef来声明Block类型变量,以达到简化使用函数指针类型时的复杂形式。
typedef int (^blk_t) (int);
在Block函数中可以截获自动变量值,但是不能改变其值。
如需改变,需要__block定义自动变量即可达到目的。如:
int val = 0;
void (^blk)(void) = ^ {val = 1;};
blk();
printf("val = %d\n", val);
如此即会报错。
修改方案: 将val定义改为 : __block int val = 0;
例2:
id array =[ [NSMutableArray alloc] init];
void (^blk) (void) = ^{
id obj = [[NSObject alloc] init];
[array addobect:obj];
}
不会报错。
id array =[ [NSMutableArray alloc] init];
void (^blk) (void) = ^{
array = [ [NSMutableArray alloc] init];
}
如此则会报错啦。若将array定义前加__block 则不会出错了。
因为在Block函数中可以使用截获的值但是不能直接像截获的变量array赋值。