C语言特性(块)

(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");
    原文作者:JackLu经纬
    原文地址: https://www.jianshu.com/p/868356a81960
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞