1.Block代码块的基本使用
-
Block的作用
- Block主要用来保存一段代码
- Block可以
封装
一段代码,这段代码可以在任何时候调用执行
-
Block能够
作为
函数的参数
或者函数的返回值
,Block自已也可以包含
参数和返回值 -
定义Block语法格式
^(block 返回值类型)(参数类型:参数1,参数类型:参数2,...)
{
//block 执行代码
}
注意
- Block 必须以 ^ 开头---- ^ block 的标志
- Block 返回值类型可以省略
- Block 不用指定名字
- 没有参数时候,参数部分( )不能省略,一般使用void
- 定义Block变量
block返回值类型 (^ block 变量名)(参数类型1,参数类型2,...);
** 注意 **
声明block变量,只需要指定参数类型
** 注意区分 Block 块和 Block 块变量,我们是将 Block 块赋值给Block 块变量 **
- Block与函数
保存代码;有返回值;有形参;调用方式一样
//1.没有返回值,没有形参
void (^ printBlock)(void) = ^{
NSLog(@"printBlock");
};
printBlock();//注意调用的时候,不要忽略( )
//2.有参数,有返回值
int(^printTest)(int ,int) = ^(int a, int b){
return a * b;
};
NSLog(@"%d",printTest(3,3));
//3.
void(^print)(NSString * str);
print = ^(NSString * str){
NSLog(@"%@",str);
};
print(@"block其实没有那么难");
void(^printA)(int) = ^(int a)
{
NSLog(@"-------");
};
printA(5);
- 我们可以先定义块变量,再对块变量进行赋值;也可以定义块变量的同时对块变量赋值
- 注意书写block时,最好先写block代码块,再写block变量
2.Block与局部变量
- Block能够
访问
局部变量的值 - Block
改变
局部变量的值,必须给局部变量加上__block修饰符
int num = 25;
void (^printNum)(void) = ^(void)
{
NSLog(@"%d",num);
};
num = 35;
printNum();
//程序输出的是25,而不是35
- 在使用block访问局部变量的时候,当我们定义block的时候,就会把局部变量的值保存在block中,并不是当我们调用block的时候才去获取局部变量的值
__block int num = 25;
void (^printNum)(void) = ^(void)
{
num = 40;
NSLog(@"%d",num);
};
num = 35;
printNum();
//程序输出的是40
- 当我们使用__block修饰局部变量:任何时候,程序都是直接访问局部变量本身,不是将局部变量的值赋值到block范围内
3.Block作为方法的参数
- 当我们把block用作方法的参数时,不用定义block变量,直接将block作为参数传递给相应方法就可以
- 苹果官方建议block通常作为最后一个参数
4.typedef定义block变量
-
作用
-
复用blcok变量类型,重复定义多个block变量
-
使用block类型定义函数参数
-
格式
typedef block返回值类型 (^block变量类型)(参数类型1 参数名,参数类型2,参数名)
//使用typedef定义块变量类型
typedef void (^ZZYPrint)(NSString * str);
//使用ZZYPrint定义块变量,并将指定block代码块赋值给该变量
ZZYPrint print1 = ^(NSString * str){
NSLog(@"%@",str);
};
ZZYPrint print2 = ^(NSString * str)
{
NSLog(@"%@",str);
};
print1(@"print1");
print2(@"print2");
//利用typedef定义的块变量类型即可为函数声明块变量类型的形参,要求传入参数时必须传入块变量
网友评论