闭包与Objective-C Block | 青训营笔记

135 阅读2分钟

这是我参与「第四届青训营 -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 = ^{
    ...
}