初探Objective-c 4:OC中的Blocks

时间:2022-09-07 11:08:06

Blocks 是什么?

如果把OC看作C语言的超集,那么Blocks就是C语言的扩充功能。用一句话来概括Blocks:带有自动变量(局部变量)的匿名函数。

匿名函数,就是不带有名称的函数。

Blocks的基本语法

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

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

上面这是Blocks的基本方式。Blocks同时也可以省略一些项目。

首先是可以省去返回值类型:

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

此时,编译器将根据return语句的类型,返回Int型返回值。

其次,如果不实用参数,参数列表也可以省去。

^ void(void){printf();}

可以省略成下面的形式:

^{printf();}

也就是: ^ 表达式

Blocks类型变量

Blocks 变量可以看作将声明函数指针类型变量的”*”变为”^”。因此,Blocks变量可以作为以下参数:

  1. 自动变量
  2. 函数参数
  3. 静态变量
  4. 静态全局变量
  5. 全局变量
int (^bk)(int)  = ^(int count)={return count+1;}

int (^bk)(int) = bk;

上面将Block语法生成的Block变量赋值给bk,同样因为类型一样,所以bk可以赋值给bk1;

Block类型变量可完全像通常的C语言变量一样使用,因此也可以使用指向Block类型变量的指针,即Block指针类型变量。

typedef int (^blk_t) int ;

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

blk_t *blkptr = &blk;
(*blkptr)(10);

截获自动变量

先来看一段代码 :


int dmy = 256;
int val= 10;
const char *fmt = "val = %d\n";
void (^blk)(void) = ^{printf(fmt,val);};

val =2;

fmt = "this is test val = %d\n";

blk();

执行结果

val  = 10
Program ended with exit code: 0

可以看到并不是输出 this is test val = 2

因为在执行到blocks的时候,block保存了val的瞬值,即使改变了blocks使用的自动变量,也不会影响Block执行时自动变量。

如果要改变局部变量,要在变量前加上 __block。

在Objective-c 高级编程中 还讲解在block的实现方法,这里才疏学浅没能很透彻的明白,还需要继续努力。