大纲
- Block的介绍
- Block语法
- Block类型变量
- 截获自动变量值
- __block说明符
Block的介绍
我们之前见到的数据类型有Double、id、OC数据类型等等,今天为大家介绍一种新的数据类型,叫做Block。
Block其实很简单,就是一段代码块,用来保存代码的,任何时候都可以调用、执行。
让我们来看看比较正规的解释:
Block:带有自动变量的匿名函数
- 匿名函数自然是说不带有名称的函数
- 带有自动变量就是局部变量、函数参数。
这一概念在计算机科学中被称为闭包(Closure),其它语言中Block的叫法如下
程序语言 | Block的名称 |
---|---|
Python | Lambda |
Javascript | Anonymous function |
C++11 | Lambda |
Block语法
^ 返回值类型 参数列表 表达式
^ int (int count) {
return count + 1 ;
}
说明:返回值类型和参数列表都可以省略哦
Block的作用
Block可作为以下用途使用:
- 自动变量
- 函数参数
- 静态变量
- 静态全局变量
- 全局变量
在实际开发过程中,我们一般这样写:
typedef void(^Myblock)(void);
- Myblock为此Block的名称
- void代表返回值和形参
给大家举一个例子
ViewController.h
#import <UIKit/UIKit.h>
typedef void(^Myblock)(void);
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
//声明Block变量类型(为什么是copy,我们后面再说)
@property (copy , nonatomic) Myblock blk_t ;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//简单的调用
Myblock block = ^(void){
NSLog(@"我是小猪佩奇");
};
block();
//作为函数参数的调用
[self successOfBlock:^{
NSLog(@"我是小猪佩奇的爸爸");
}];
}
//我们看看Block作为函数参数怎么用
- (void)successOfBlock:(Myblock) Block {
self.blk_t = Block ;
self.blk_t();
}
@end
输出
Block[19309:1988009] 我是小猪佩奇
Block[19309:1988009] 我是小猪佩奇的爸爸
截获自动变量值
先来看看这个(可以自己猜猜输出结果)
//代码我就简写了
int main ()
{
int value = 5 ;
Myblock block = ^(void){
NSLog(@"%d",value);
};
value = 10 ;
block();
}
输出
Block[19330:1991018] 5
原因涉及Block的底层实现原理,我们在稍后的文章中介绍。
那我们可以在block中更改value的的值吗?
我们可以看到,编译器是报错的,说变量不可赋值(缺少块类型说明符)
那什么是块说明符呢?
_ _block说明符
我们怎样去修改被保存的自动变量值呢?
int main ()
{
__block int value = 5 ;//两个_
Myblock block = ^(void){
value = 10 ;
NSLog(@"%d",value);
};
block();
}
输出
Block[19368:2003507] 10
最后
这就是关于Block的简单介绍,关于Block的本质我们在后面的文章中介绍给大家