块
块(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");
网友评论