Blocks

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赋值。


















你可能感兴趣的:(Blocks)