Blocks

Blocks简介

Blocks 是C语言的扩充功能,是带有自动变量(局部变量)的匿名函数。

Block语法

  1. Block语法
    ^ 返回值类型 参数列表 表达式
^int (int count) {
    return count + 1;
}
  1. Block语法省略返回值类型
    如果有return语句就使用该返回值的类型,如果表达式没有return语句就使用void类型。
    ^ 参数列表 表达式
^ (int count) {
    return count + 1;
}
  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

你可能感兴趣的:(Blocks)