iOS中Block理论知识过一遍

一、Block的简介

Block作为C语言的扩充功能,是在OS X Snow Leopard和iOS 4引入的。

用一句话表示Block的扩充功能:带有自动变量(局部变量)的匿名函数。

第一个方面,匿名函数就是不带有名称的函数。在C语言的标注中是不允许存在这样的函数的,而通过Block,源代码中就能够使用匿名函数,即不带名称的函数。对于程序员而言,命名就是工作的本质,函数名、变量名、方法名、属性名、类名和框架名等都必须具备,而能够编写不带名称的函数对程序员来说相当具有吸引力。

既然是函数,结合对函数的了解,Block更像是函数指针,知道有以下几种情况:

1、函数指针的类型

  1.1、函数指针类型的声明

2、函数指针的声明

  2.1、函数指针类型的变量

3、函数指针的定义

4、函数指针的使用

  4.1、函数指针的调用

  4.2、函数指针作为参数进行传递

  4.3、函数指针作为返回值进行返回

对应在Block上便是:

1、Block的类型

  1.1、Block类型的声明

2、Block的声明

  2.1、Block类型变量的声明

3、Block的定义

4、Block的使用

  4.1、Block类型变量的调用

  4.2、Block类型变量作为参数进行传递

  4.3、Block类型变量作为返回值进行返回

理解的顺序应该是:

->Block的定义

->Blcok类型变量的声明

->Block类型变量的调用

->Block类型变量作为参数进行传递

->Block类型变量作为返回值进行返回

->Block类型的声明

1、Block的定义

Block的定义,一看就能明白,用多了就习惯了,这里需要注意的是,Block定义时的省略写法,示意图如下:

例如可以写出如下形式的Block语法:

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

返回值类型可以省略,当省略返回值类型时,如果表达式中有return语句就使用该返回值的类型,如果表达式中没有return语句就使用void类型。表达式中含有多个return语句时,所有return的返回值类型必须相同。前面的源代码省略其返回值类型时如下所示:

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

该Block语法将按照return语句的类型,返回int类型返回值。

其次,如果不使用参数,参数列表页可以省略。以下为不使用参数的Block语法:

^void (void) {
  printf("Blocks
");
}

该源码也可省略为如下形式:

^{
  printf("Blocks
");
}

当然如果没有参数列表,但是有返回值,可以这样写:

^(void) {
  return 100;
}
// 或者
^{
  return 100;
}

2、Block类型变量的声明和Block类型变量的调用

前面介绍了Block定义的标准格式和各种省略形式,但是在编程中一般都是先声明函数,然后对函数进行定义,然后就是对函数进行调用,那么Block的声明和调用如何呢?

声明Block类型变量的示例如下:

int (^blk) (int);

声明Block类型变量的标准范式如下,省略方式如下:

那么,使用Block语法将Block赋值为Block类型的变量方式如下:

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

通过前面对Block定义时的省略形式的学习,可以写成:

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

那么Block类型变量的调用形式呢,如下所示:

blk(5);

3、Block类型变量作为参数进行传递与Block类型变量作为返回值进行返回

由“^”开始的Block语法生成的Block被赋值给变量blk中,因为与通常的变量相同,所以当然也可以由Block类型变量想Block类型变量赋值。如下所示:

int (^blk) (int) = blk;
int (^blk2) (int);
blk2 = blk;

因此,在函数参数中使用Block类型变量可以向函数传递Block,如下所示:

//函数的定义,参数为Block类型,形参为blk
void func(int (^blk) (int)) {...}

//函数的调用,将Block类型的blk2实参,传递给函数
func (blk2);

------未完待续2021年6月12日

原文地址:https://www.cnblogs.com/cchHers/p/14877127.html