Block是iOS中一种比较特殊的数据类型。
Block是苹果官方特别推荐使用的数据类型,应用场景比较广泛:
·动画
·多线程
·集合遍历
·网络请求回调
Block作用:
·用来保存一段代码,可以在恰当的时间再取出来调用
·功能有点类似于函数和方法
1.定义简单的block变量
类似于函数和方法的定义:参数、返回值
(1)无参数无返回值
void (^Block名称)()=^{......};
如:void (^logStar)()=^{NSLog(@"****"););
(2)有参数无返回值
void (^Block名称)(参数类型1,参数类型2...)=^(参数类型1 参数1,参数类型2 参数2...){...};
如:void (^logStar2)(int)=^(int numberOfLine){
for(int i=0;i<numberOfLine;i++)
NSLog(@"***");}//打印numberOfLine行***
(3)有参数也有返回值
返回值数据类型 (^Block名称)(参数类型1,参数类型2...)=^(参数类型1 参数1,参数类型2 参数2...){....return 返回值};
如:int (^minusBlock)(int,int)=^(int x,int y){return x-y;};
2.block与typedef
typedef一般用法:typedef 数据类型 数据类型别名;
在block中:typedef 返回值类型 (^block名称)(参数1数据类型,参数2数据类型...);
如 typedef int (^MyBlock)(int,int);
//定义一个叫做MyBlock的数据类型,它存储的代码必须返回int,必须接收两个int类型的参数
//利用MyBlock类型可以定义block变量
用法如:MyBlock minusBlock=^(int x,int y){ return x-y;};
注意:
(1)调用block之前一定要做判断才严谨
如:void goToWork(void(^work)())={if(work!=nil) work();}
调用goToWork()时不会报错,因为已经做了work是否为空的判断,若没有if(work!=nil)的判断,直接调用goToWork()时由于传的参数为空,程序会报错!
(2)默认情况下,block能调用但不能修改外面的局部变量
但在局部变量前加上修饰__block,则能在block中修改变量值
网友评论