Block也是一种基本数据类型
本节的知识点
1: Block实际上就是一个匿名方法,(注意,是个方法!!)只不过他是基本数据类型,可以作为参数传递,可以有返回值,能够声明成变量。
2:Block基本数据类型弥补了指向函数的指针不能够不能够直接保存一个函数体(代码快)的缺陷,原来我们不能够再一个方法中再写入一个方法,有了block之后就可以了
3:Block可以访问外界的成员变量,但是不能够修改过,想修改的话要用__block关键字进行声明,不过实际当中一般都不改,所以不举例了
我们在开发当中一般都是什么时候会用到block类型呢???
在实际开发当中,如果你发现一个方法中的算法有多重实现方式,你一时还不知道那个更好,就可以把方法中其中一个参数定义成Block方式,(现在可能理解不了,没关系,后面开发的时候多用几次就会了);
首先我们看一下Block基本类型的格式,main函数中 调用了一个定义类Calculate,还用Block写了一个测试加减乘除的方法 calculateWithNumber1:andNumber2: andCalculate:#import <Foundation/Foundation.h>
#import "Calculate.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//回忆一下OC中的基本数据类型 int ,char,float ,double
//新增的类型:NSObject ,id ,BOOL,block,SEL
//不带参数的block书写格式
void (^myBlock)() =^{
NSLog(@"不带参数的格式");
};
//带参数的block书写格式
int (^sumBlock)(int a ,int b)=^(int a ,int b){
NSLog(@"带参数的格式");
return a+b;
};
NSLog(@"测试求和结果:%i",sumBlock(10,30));
//下面我们用block实现两个数的加减乘除,Calculate(计算类)
//下面是第三步
//为了实现加减乘除我们把block这个参数给摘出来在外面写
int (^sum2)(int a ,int b) = ^(int a,int b){
return a +b;
//return a-b;
//return a*b;
//return a/b;
};
//下面是第一步
Calculate *cal = [[Calculate alloc]init];
//提示的时候双击block方法会自动显示出来格式
//下面是第二步
// int sumNumber = [cal calculateWithNumber1:45 andNumber2:50 andCalculate:^int(int a, int b) {
// return a+b;
// }];
int sumNumber = [cal calculateWithNumber1:45 andNumber2:50 andCalculate:sum2];
NSLog(@"测试加减乘除的结果:%i",sumNumber);
}
return 0;
}
Calculate类的.h文件
#import <Foundation/Foundation.h>
typedef int (^calculateBlock)(int a ,int b);
@interface Calculate : NSObject
-(int)calculateWithNumber1:(int)number1 andNumber2:(int)number2 andCalculate:(calculateBlock)calculate;
@end
Caculate类的.m文件
#import "Calculate.h"
@implementation Calculate
-(int)calculateWithNumber1:(int)number1 andNumber2:(int)number2 andCalculate:(calculateBlock)calculate
{
//经常变化的功能,在设计当中叫做封装变化
return calculate(number1,number2);
}
@end