Object-C高级编程学习笔记(二)

Blocks

What is blocks

Block语法

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

^ 返回值类型 参数列表 表达式

^int (int count) {return count + 1;}

Block语法可以省略几个项目。首先是返回值类型:

^(int count) {return count + 1;}

其次,如果不使用参数,参数列表可以省略:

^{ print(“Block\n”);}

使用Block语法讲Block赋值为Block类型变量:

int(^blk) (int) = ^(int count) {return count + 1;}
int(^blk1) (int) = blk;

使用typedef定义:

typedef int (^blk_t) (int);
blk_t blk = ^(int count) {return count + 1;}
int nResult = blk(10);

Block类型变量可以像C语言中其他类型变量一样使用。

截获自动变量值

Blocks中,Block表达式截获所使用的自动变量的值。因为Block表达式保存了自动变量的值,所以在执行Block语法后,即使改写Block中使用的自动变量的值也不会影响Block执行时自动变量的值。

int a = 10;
int b = 10;
int (^blk) (void) = ^(return a + b;);
b = 2;
blk();

执行结果为:20

__block说明符

若想在Block语法的表达式中将值赋给Block语法外的自动变量,需要在自动变量附加block说明符,该变量成为block变量。

__block int val = 0;
void(^blk) (void) = ^{val = 1;};
blk();
printf("%d",val);

执行结果为: 1

赋值给截获的自动变量会产生编译错误:

id array = [[NSMutableArray alloc] init];
void (^blk) {array = [[NSMutableArray alloc] init]};

会出现编译错误。

另外,在使用C语言数组时,必须小心使用起指针。

const char text[] = "Hello";
void (^blk) (void) = ^{
    printf("%c\n",text[2]);
};

在现在的Block中,截获自动变量的方法并没有实现对C语言数组的截获,因此会编译出错。可以使用指针解决:

const char *text = "Hello";
void (^blk) (void) = ^{
    printf("%c\n",text[2]);
};  

Blocks的实现

// TODO:需要一些时间理解