Block的演变过程
1.定义一个函数,无参数,无返回类型
void test(){ NSLog(@"这是一个普通C函数");}
2.定义一个无参数,无返回类型的Block时使用 用尖号"^"表示它是一个Block,
如void (^myBlock)(),myBlock是Block的名字,后面()代表它没有参数,不可省略.
将上面test函数的函数体前加一个^号就是一个完整的代码块,不要忘记函数体后要加";"号
^{NSLog(@"这是一个普通C函数");};
//函数调用 test(); //定义一个Block void (^myBlock)() = ^{ NSLog(@"这是一个无参,无返回类型的Block"); }; //调用Block myBlock();
定义一个有参数,有返回值的Block
1.还是按照一个有参数有返回类型的函数推理,即:
int sum(int a ,int b){ return a + b;}
2.定义:
1>确定Block的返回值类型
2>定义一个有意义的名字
3>有几个参数,参数的类型是什么
4>在代码块中编写要执行怎样的操作,
5>调用这个Block
//有参有反的Block int (^sumBlock1)(int a ,int b) = ^(int a ,int b){ return a + b; };//传递参数,并定义变量接收结果int sum = sumBlock1(1,2);NSLog(@"sum = %i",sum);
Block在某个类中作为参数传递
1.Block既然是一种数据类型,不可以直接传递.首先使用typedef定义,它的block名calculateBlock,并将它作为参数
#importtypedef int (^calculateBlock)(int a,int b);@interface UseBlock : NSObject-(int)calculateNumber1:(int)num1 andNum2:(int)num2 andCalculate:(calculateBlock)calculate;@end
2.在.m文件中实现
@implementation UseBlock- (int)calculateNumber1:(int)num1 andNum2:(int)num2 andCalculate:(calculateBlock)calculate{ //这里自己理解为嵌套传递 return calculate(num1 , num2);}@end
3.如何使用
//定义两数之和的blockint (^sumBlock)(int a ,int b) = ^(int a ,int b){ return a + b; };UseBlock *u = [[UseBlock alloc]init];//将定义好的block作为参数传递int result = [u calculateNumber1:10 andNum2:20 andCalculate:sumBlock];NSLog(@"%i",result);