C语言特性(块)

作者: JackLu经纬 | 来源:发表于2015-12-23 00:45 被阅读0次

(Block)是Objective-C对ANSI C所做的扩展,使用块可以更好地简化Objective-C编程,而且Objective-C的很多API都依赖于块

块的基本语法

定义块的语法格式如下:

^[块返回值类型] (形参类型1 形参1,形参类型2 形参2,  ...){
    //块执行体
}

从上面的语法格式可以看出,定义块的语法非常像定义一个函数,但只是定义一个匿名函数。定义块与定义函数的语法格式存在如下差异。

1.定义块必须以^开头。
2.定义块的返回值类型可以省略,而且经常都会省略声明块的返回值类型。
3.定义块无须指定名字。
4.如果块没有参数,此时参数部分括号不能省略,但内部可以留空,通常建议使用void作为占位符。

如果程序需要以后多次调用已经定义的块,那么应该将该块赋给一个块变量。定义块变量的语法格式如下:

块返回值类型 (^块变量名) (形参类型1 , 形参类型2 , ... );
例:
//定义不带参数、无返回值的块
void (^printStr) (void) = ^(void){
    NSLog(@"这是块");
};
//使用printStr调用块
printStr();
//定义带参数、有返回值的块
double (^hypot) (double ,double) = ^(double num1 ,double num2){
    return sqrt(num1 * num1 + num2 * num2);
};
//调用块,并输出块的返回值
NSLog(@"%g" , hypot(3,4));
//也可以先只定义块变量:定义带参数、无返回值的快
void (^print) (NSString *);
//再将块赋值给指定的块变量
print = ^(NSString * info){
    NSLog(@"info参数为:%@" , info);
}
//调用块
print(@"测试块调用");

块与局部变量

块可以访问程序中局部变量的值,当块访问局部变量的值时,不允许修改局部变量的值
如果不希望在定义块时就把局部变量的值复制到块中,而是等到执行时才去访问、获取局部变量的值,甚至希望块也可以改变局部变量的值,此时可以考虑使用_block修饰局部变量。

例:
//定义_block修饰的全局变量
_block int my = 20;
void (^printMy)(void) = ^(void){
    //运行时访问、获取局部变量的值,此处输出45
    NSLog(@"%d" , my);
    //尝试对_block局部变量赋值是允许的
    my = 30;
    //此处输出30
    NSLog(@"%d" , my);
};
my = 45;
printMy();//调用块
//由于块修改了_block局部变量的值,因此下面的代码输出30
NSLog(@"块执行完后,my的值为:" , my);

使用typedef定义块类型

使用typedef可以定义块类型,定义了块类型后,该块类型主要有如下两个用途。

1.复用块类型,使用块类型可以重复定义多个块变量。
2.使用块类型定义函数参数,这样即可定义带块参数的函数。

使用typedef定义块类型的语法格式如下:

typedef 块返回值类型 (^块类型) (形参类型1 [形参名] ,形参类型2 [形参名] , ... );
例:
//使用typedef定义块类型
typedef void (^FKPrintBlock) (NSString*);
//使用FKPrintBlock定义块变量,并将指定块赋给该变量
FKPrintBlock print = ^(NSString * info){
    NSLog(@"%@" , info);
};
//使用FKPrintBlock定义块变量,并将指定块赋值给该变量
FKPrintBlock loopPrint = ^(NSString * info){
    for (int i = 0 ; i < 3 ; i++){
        NSLog(@"%@" , info);
    }
};
//一次调用两个块
print(@"Objective-C");
loopPrint(@"iOS");

相关文章

  • C语言特性(块)

    块 块(Block)是Objective-C对ANSI C所做的扩展,使用块可以更好地简化Objective-C编...

  • iOS块-block和closures

    这遍文章是我对块的理解! 1块: 块是cocoa应用开发强大的c语言特性。和swift的闭包closure,...

  • C#语言特性发展史

    C#语言特性发展史 Intro 本文主要总结介绍C# 每个版本带来的不同的语言特性。 C#,读作C Sharp,是...

  • C语言特性

    1.条件编译 #ifdef #ifndef #else #endif 2.格式 一。 #ifdef 宏名称 //任...

  • 面试题之 OC

    OC语言的特性? ①OC 语言是 C 语言的一个超集,在 C 的基础上添加了面向对象的特性;②OC 语言与 Jav...

  • 【转】Shader学习之九(CG语言基础)

    CG语言基础 一、Cg语言的特性:Cg是一种类C的语言,他沿用了大量的C语言特性,但是也有不同之处。Cg语言是脚本...

  • 关于Block的那些事

    理解“块”这一个概念 块可以实现闭包。这项语言特性是作为“扩展”而加入GCC编译器中的,从技术上讲,这是个C语言层...

  • 一篇文章看懂iOS代码块Block

    iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...

  • 一篇文章看懂iOS代码块Block

    iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,B...

  • Block 小记

    简介 Block 是C语言级的语法也是一个运行时特性。它和C语言的标准函数很相似,但是在有可执行的代码块的基础上它...

网友评论

    本文标题:C语言特性(块)

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