这是我参与「第四届青训营 -IOS场」笔记创作活动的第2篇笔记
闭包
闭包的定义
闭包是计算机科学里一个通用的概念。闭包可以被认为是一个结构体,存储了函数入口地址和与之绑定一系列环境,环境里面既有其本身的内部定义的变量,又包含从外部捕获的变量,捕获变量的处理因实现而异。每种编程语言都有各自的闭包表现形式。
在Objective-C中,闭包是通过Block实现的,以下是简单的闭包实例
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
int i = 1024;
void (^printBlock)(void) = ^{
printf("%d\n", i);
};
printBlock();
}
return 0;
}
OC中的Block
Block的基础概念
- block是闭包在Objective-C中的实现
- block是一种数据类型,block类型的变量用来存储一段代码,这段代码可以有参数和返回值
- block可以分配在栈和堆上,也可以是全局的。分配到栈上的块可以拷贝到堆中,同标准的Objective-C对象一样,具备引用计数
语法格式
// block声明
returnType (^blockName)(parameters);
// block赋值
^returnType(parameters) {
// do something;
};
// 示例
int (^sumBlock)(int a, int b) = ^int(int a, int b) {
return a + b;
};
int sum = sumBlock(1, 1);
关于Block的简写
- 关于Block声明的简写
- 在声明时可以省略Block的参数名,只保留参数类型,而在实现时不能省略参数名。
- 在声明block变量时,常用typedef给block定义别名来达到简化的目的,只需要在声明的左边加上typedef即可。
//简化前
int (^sumBlock)(int a, int b) = ^int(int a, int b) {
return a + b;
};
//省略参数名,仅保留参数类型
int (^sumBlock)(int, int) = ^int(int a, int b) {
return a + b;
};
//使用typedef为block定义别名
typedef int (^sumBlock)(int a, int b);
SumBlock block = ^(int a, int b) {
return a + b;
};
- 关于Block实现的简写
//如果block没有返回值,可以省略 void ,其实无论是否有代码段返回值,都可以省略返回值类型
xxx = ^void(参数){
...
}
xxx = ^(参数){
...
}
//如果block没有参数,可以省略 ()
xxx = ^int(){
...
}
xxx = ^int{
...
}
//如果无返回值无参数,可以都省略,仅保留^{}
xxx = ^{
...
}