前言
block是C语言的扩充功能,用一句话来解释就是:带有自动变量(局部变量)的匿名函数,就是不带有名称的函数。其实block的定义有点像函数指针,很多语言其实都有类似block的概念。
block语法
block的基本语法形式是:
^
返回值类型
参数列表
表达式
例如:
^ int (int num) {return num +1;}
^ int (int num1,int num2) {return num1 + num2;}
有时候我们可以省略其中的几项,首先是返回值,如果表达式中没有返回值时,也就是说没有return
语句的时候返回值类型是可以省略,例如:
^ (int num) {NSLog(@"数字:%@",num);}
没有参数的时候,参数列表也是可以省略的
^ int {return 10*10;}
甚至有时候返回类型和参数列表都可以省略
^ {NSLog(@"这是一段代码");}
block类型变量
那如何声明一个block类型的变量呢
返回值类型
(^变量名)
(参数类型列表)
例如:
int (^oneBlock) (int);
int (^oneBlock) (int,int);
如何给变量赋值呢
int (^oneBlock) (int) = ^ int (int num) {return num +1;};
而且变量之间也可以互相赋值
int (^oneBlock1) (int) = oneBlock;
自定义block类型
我们可以利用typedef
来定义一个block类型
typedef int (^BlockType)(int);
这样我们就可以直接使用BlockType
作为类型来声明变量
BlockType oneBlock;
oneBlock = ^ int (int num) {return num +1;};
将block类型作为函数参数
我们也可以将block类型的参数向函数中传递
- (void)func:(BlockType)block{
NSLog{@"number:%d",block(2)};
}
__block说明符
如果想在block的表达式中,给block语法外声明的变量赋值,需要在变量前加__block
说明符。
__block int num = 0;
void (^oneBlock)(void) = ^{
num = 1;
}
再来看以下代码
NSMutableArray * array = [[NSMutableArray alloc] init];
void (^oneBlock)(void) = ^{
id obj = [[NSObject alloc] init];
[array addObject:obj];
}
这样是没有问题的,但是以下代码就有问题了
NSMutableArray * array = [[NSMutableArray alloc] init];
void (^oneBlock)(void) = ^{
array = [[NSMutableArray alloc] init];
}
这样就出错了,这时需要在变量前加__block
,如下
__block NSMutableArray * array = [[NSMutableArray alloc] init];
void (^oneBlock)(void) = ^{
array = [[NSMutableArray alloc] init];
}
版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!