Blocks简介
Blocks 是C语言的扩充功能,是带有自动变量(局部变量)的匿名函数。
Block语法
- Block语法
^ 返回值类型 参数列表 表达式
^int (int count) {
return count + 1;
}
- Block语法省略返回值类型
如果有return语句就使用该返回值的类型,如果表达式没有return语句就使用void类型。
^ 参数列表 表达式
^ (int count) {
return count + 1;
}
- Block语法省略返回值类型和参数列表
^ 表达式
^ {
NSLog(@"Block");
}
Block类型变量
- Block变量的声明
int (^blockName) (int);
Block类型变量可以作为 自动变量、函数参数、静态变量、静态全局变量、全局变量 来使用。
- Block类型变量赋值
int (^blockName) (int) = ^(int count) {
return count + 1;
};
- 向函数传值
void func(int (^blockName)(int)) { }
- 函数返回值
int (^func()) (int) { return ^(int count){ return count + 1; } };
- typedef
typedef int (^blk_t) (int);
- 调用Block类型变量
int result = blk_t(10);
- 函数调用
int func (blk_t blk, int rate)
{
return blk(rate);
}
-- (int) methodUsingBlock:(blk_t)blk rate:(int)rate
{
return blk(rate);
}
- Block类型指针
blk_t blk = ^(int count) {return count + 1;};
blk_t *blkptr = &blk;
(*blkptr)(10);
截获自动变量值
int main(int argc, char * argv[]) {
int val = 10;
const char * fmt = "val = %d\n";
void (^blk)(void) = ^{printf(fmt,val);};
val = 2;
fmt = "These values were changed. val = %d\n";
blk();
return 0;
}
val = 10
Block语法的表达式使用的是它之前声明的自动变量fmt和val。Block表达式截获所使用的自动变量的值,即保存该自动变量的瞬间值,在执行Block语法后,即使改变Block中使用的自动变量的值也不会影响Block执行时自动变量的值。
int main(int argc, char * argv[]) {
int val = 10;
const char * fmt = "val = %d\n";
val = 2;
fmt = "These values were changed. val = %d\n";
void (^blk)(void) = ^{printf(fmt,val);};
blk();
return 0;
}
These values were changed. val = 2
__block变量
使用__block说明符的自动变量可以在Block中赋值。
int main(int argc, char * argv[]) {
__block int val = 0;
void (^blk)(void) = ^{val = 1;};
blk();
printf("val = %d\n",val);
return 0;
}
val = 1