目录
Blocks概要
什么是Blocks
Blocks是C语言的扩充功能,即带有局部变量的匿名函数。
顾名思义,不带有名称的函数,C语言的标准可不允许存在这样的函数。就算是使用函数指针调用函数也需要知道函数名称。
OC转C++方法
因为需要看Block操作的C++源码,所以要知道转换的方法:
打开终端,cd到OC源文件
.m
所在的文件夹,输入clang -rewrite-objc 文件名称.m
,就会在当前文件夹内自动生成对应的.cpp
文件.
关于几种变量的特点
C语言函数中可能使用的变量:
- 函数参数
- 自动变量(局部变量)
- 静态变量(静态局部变量)
- 静态全局变量
- 全局变量
而且,由于存储区域特殊,这其中有三种变量是可以在任何时候以任何状态调用的(在函数的多次调用之间能够传递值的变量):
- 静态变量
- 静态局部变量
- 全局变量
虽然这些变量的作用域不同,但在整个程序中,一个变量总保持在一个内存区域。而其他两种虽然有各自相应的作用域,超过作用域后,会被销毁。
Blocks模式
Block语法
完整形式的Block语法与一般的C语言函数定义相比,仅有两点不同:
- 没有函数名,即匿名函数;
- 带有
^
,因为iOS、Mac OS应用程序的源代码中将大量使用Block,所以插入该记号便于查找。
Block语法的BN范式:^
返回值类型
参数列表
表达式
。例如:
^int (int value, int count) {
return count * value;}
可省略返回值类型:
^(int value, int count) {
return count * value;}
省略返回值类型的情况下:
- 表达式中
return
的类型就是返回类型; - 表达式中无
return
语句说明是void
类型; - 表达式中含有多个
return
语句时,所有return
的返回值类型必须相同。
可省略参数列表,如果不使用参数:
^void (void) {
printf("Blocks\n");}
//省略形式
^{
printf("Blocks\n");}
Block类型 变量
定义C语言函数时,可以将所定义的函数的地址赋值给函数指针类型的变量:
int func(int count) {
return count + 1;
}
int (*funcptr) (int) = &func;
同样的,Block是一种数据类型,可将Block语法赋值给声明为Block类型的变量:
//声明Block类型变量仅仅是将声明函数指针类型变量的*变为^
int (^blockName) (int);
//赋值(Block内容的实现)
int (^blockName) (int) = ^(int count) {
return count + 1;
};
如果我们在项目中经常使用某种相同类型的block,可以用typedef
抽象出这种类型的Block:
typedef int (^AddOneBlock) (int count);
AddOneBlock blockName = ^(int count) {
return count + 1;};
用typedef
给Block起别名,使得block的赋值和传递变得相对方便,因为block一经抽象出来了:
typedef int (^block_t) (int);
//block作为参数
void func(int (^blockName) (int));
//简化后
voi