Block(MJ笔记)

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

                                   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中修改变量值

你可能感兴趣的:(Block(MJ笔记))