• 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日

  • 相关阅读:
    [VueJS + Typescript] Decouple Dependencies Using IoC Containers in Vue with TypeScript and InversifyJS
    便利店选址
    spoj 1811 Longest Common Substring (后缀自动机)
    sharepoint 2013 根据网站模版创建网站,并赋值网站权限 create a site by custom site template
    一则 ORA-00471 处理方法
    好端端的项目重新运行的时候却不行了!!!
    C语言指针和数组知识总结(下)
    Java EE登陆界面生成随机数防止恶意注册或者登录
    ASP.NET获取上传图片的大小
    Not able to reset SmartRF04DD
  • 原文地址:https://www.cnblogs.com/cchHers/p/14877127.html
Copyright © 2020-2023  润新知