Blocks概要
什么是Block,笔者认为Block其实就是一段代码块,这段代码块可以嵌入在函数中并且带有自己的局部变量。
Blocks是C语言的扩充功能。可以用一句话来表示Blocks的扩充功能:带有自动变量(局部变量)的匿名函数。
顾名思义,所谓匿名函数就是不带有名称的函数。而通过Blocks,源代码中就能够使用匿名函数。
Block语法
Block语法基本形式:
^ 返回值类型 参数列表 表达式
^int (int count) {return count + 1;}
Block语法的省略
- Block语法可以省略返回值类型。当省略返回值类型时,如果表达式中有return语句,则使用该返回值类型;如果有多个return语句,则每个语句的返回值类型必须一致;如果没有返回值,则使用void类型:
^ (int count) { return count + 1; }// 返回值类型为int
^ (int count) { NSLog(@"Hello World!"); }// 返回值类型为void
^ (int count) {
if(count > 1)
return count;
else
return --count;}// 返回值类型为int
^ (int count) {
if(count > 1)
return count;
else
return @"11";}// 错误
- 如果不使用参数,参数列表也可以省略
^ { NSLog(@"Hello World!");}
Block类型变量
当我们定义了一段Block代码块后,怎么使用呢?这时候就需要用到Block类型变量。Block类型变量的声明和Block语法块的头部差不多(头部即除去表达式部分)。和Block语法不同是,Block类型变量不能省略。同时,Block类型变量和Block语法块的返回值类型和参数列表相同。
int (^blk) (int) = ^ (int count){return count + 1;};
int t = blk(10);
NSLog(@"value:%d",t);
运行结果:
Block语法特性
- Block可以截获自动变量
-
__block
说明符 - 截获的自动变量
截获自动变量
Blocks中Block表达式截获所使用的自动变量的值,即保存该自动变量的瞬间值。因为Block表达式保存了自动变量的值,所以在执行Block语法后,即使改写Block中使用的自动变量的值也不会影响Block执行时的自动变量的值。
int t = 10;
void (^blk) (void) = ^ {NSLog(@"t value is :%d",t);};
t = 0;
blk();
运行结果:
__block
说明符
Block所截获的自动变量的值只是执行Block语法瞬间的值,即在执行Block语法的瞬间,自动变量的值是多少Block语法截获的值就是多少,执行完成Block之后,自动变量的值改变,Block中截获的值也不会变。且截获的值只是保存,不能修改。
int t = 10;
void (^blk) (void) = ^ {
t = 3;
NSLog(@"t value is :%d",t);};
t = 0;
blk();
运行结果:
若我们想要修改其值,需要添加__block
说明符:
__block int t = 10;
void (^blk) (void) = ^ {
t = 3;
NSLog(@"t value is :%d",t);};
t = 0;
blk();
运行结果:
截获的自动变量
当Block语法截获未添加__block
说明符自动变量后,调用改变量的对象方法不会出错,但是对自动变量赋值就会出错。
- 使用对象方法:
id array = [NSMutableArray array];
NSLog(@"%lu",(unsigned long)[array count]);
void (^blk) (void) = ^ {
id objc = [[NSObject alloc] init];
[array addObject:objc];};
blk();
NSLog(@"%lu",(unsigned long)[array count]);
运行结果:
- 对自动变量赋值:
id array = [NSMutableArray array];
void (^blk) (void) = ^ {
id array = [NSMutableArray array];};
blk();
运行结果:
所以,想要修改自动变量还是需要添加__block说明符。
结语
- 关于Block的本质,请参阅Objective-C之Blocks(二)
- 如有错误,欢迎指正。
- 参考资料:
[1] Kazuki Sakamoto,Tomohiko Furumoto.Objective-C高级编程〔M〕.北京:人民邮电出版社,2013