美文网首页
Blocks概要

Blocks概要

作者: 爪爪123 | 来源:发表于2020-06-14 15:09 被阅读0次

1.1什么是Block?
Block是C语言的扩充功能。可以用一句话来表示Block的扩充功能:带有自动变量(局部变量)的匿名函数。
顾名思义,所谓匿名函数就是不带有名称的函数,C语言的标准不允许存在这样的函数。如以下源代码:

int func(int count);

它声明了名称为func的函数。下面的源代码中为了调用该函数,必须使用该函数的名称func.

int result = func(10);

如果像下面这样,使用函数指针来代替直接调用函数,那么似乎不用知道函数名称也能够使用函数。

int result = (*funcptr(10));

但其实使用函数的指针也仍然需要知道函数名称,像以下与源代码这样,在赋值给函数指针时,若不使用想赋值的函数的名称,就无法取得该函数的地址。

int (*funcptr)(int)=&func;
int result = (*funcptr)(10);

而通过block,源代码中就能够使用匿名函数,即不带名称的函数。对于程序员而言,命名就是工作的本质。函数名、变量名、方法名、属性名、类名、和框架名称等都必须具备。而能够编写不带名称的函数对程序员来说相当具有吸引力。

2,block模式
2.1block语法

 ^(int event){
        NSLog(@"1111111111111");
    };

实际上该block语法使用了省略方式,其完整形式如下:

 ^void (int event){
        NSLog(@"1111111111111");
    };

如上所示,完整形式的block语法与一般的C语言函数定义相比,仅有两点不同。
(1)没有函数名。
(2)带有“^"。
第一点不同是没有函数名,因为它是匿名函数。第二点不同是返回值类型前带有”^"(插入记号,caret),因为)OS X,iOS应用程序的源代码中将大量使用block,所以插入该记号便于查找。
以下为block的语法:
^ 返回值类型 参数列表 表达式
表达式中有return语句时,其类型必须与返回值类型相同。
例如可以写出如下形式的block语法:

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

虽然前面出现过省略方式,但block语法可以省略好几个项目,首先是返回值类型。
^ 参数列表 表达式
省略返回值类型时,如果表达式中有return语句时就使用该返回值类型,如果表达式中没有return语句就使用void类型。表达式中年含有多个return语句时,所有return的返回值类型必须相同,前面的源代码省略其返回值类型时的表达式如下所示:

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

该block语句将按照return语句的类型,返回int型返回值。
其次,如果不使用参数,参数列表也可省略。以下为不使用参数的block语法:

^void (void){NSLog(@"11111");}

该代码可省略为如下形式:

^{NSLog(@"111111");}

返回值类型、参数列表均被省略的block语法:
^ 表达式

相关文章

网友评论

      本文标题:Blocks概要

      本文链接:https://www.haomeiwen.com/subject/ovpxxktx.html