一种新的数据类型,用于定义变量
Block类型的变量中存储的数据是一段程序代码
1. 语法
void/*返回值类型*/(^myBlock/*名字*/)(void/*形参*/) = ^void(void)/*与前面一一对应*/{
NSLog(@"Block被执行了")
double (^myBlock1)(int,int/*可以直接只写数据类型*/) = ^double(int a,int b/*需要写上形参名*/){
return a+b;
}
};
(左右相等)
typedef void(^BlockType)(void);//定义了一个Block的数据类型
typedef double(^myBlock2)(int,int);
2. Block与全局变量
//Block与全局变量
myBlock2 b3 = ^double(int a,int b){
a *= g_i;//全局变量可以被访问
g_i = 20;//全局变量可以被赋值
return a+b;
};
NSLog(@"%lg",b3(2,3));
NSLog(@"%d",g_i);
3. Block与局部变量
//Block与局部变量
int i2 = 30;
__block int i3 = 50;
BlockType b4 = ^void(void){
NSLog(@"%d",i2);//局部变量可以在Block中被访问
// i2= 40;//局部变量不能在Block中被赋值
i3 = 60;//加上关键字__block后,局部变量可以在Block中被赋值
};
b4();
NSLog(@"%d",i3);
4.Block在自定义类中的使用
//Block在自定义类中的使用
TRMyClass *myC = [[TRMyClass alloc]init];
[myC method];
[myC method:^void(void){
NSLog(@"无话可说");
}];
[myC method:^void(void){
NSLog(@"有话说");
}];
[myC method2:^double(int a,int b){
return a+b;
}];
[myC method2:^double(int a,int b){
return a*b;
}];
[myC method3:^double(int a,int b){//既传算法又传数据的Block
return a+b;
}withX:10 andY:20];
[myC getBlock]();
myC.b = ^void(void){
NSLog(@"Block做类的属性");
};
myC.b();
5. Block与数组
//Block与数组的关系
NSNumber *a1 = [NSNumber numberWithInt:10];
NSNumber *a2 = [NSNumber numberWithInt:8];
NSNumber *a3 = [NSNumber numberWithInt:20];
NSNumber *a4 = [NSNumber numberWithInt:2];
NSNumber *a5 = [NSNumber numberWithInt:15];
NSArray *num = @[a1,a2,a3,a4,a5];
NSArray *sorted = [num sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){
return [obj1 compare:obj2];//从小到大排序
}];
NSLog(@"%@",sorted);
NSArray *str = @[@"one",@"two",@"three"];
sorted = [str sortedArrayUsingComparator:^NSComparisonResult(id obj1,id obj2){
return [obj1 compare:obj2];//按字母的大小顺序排序
}];
NSLog(@"%@",sorted);
6. Block与字典
//Block与字典
NSDictionary *dic1 = @{@"1":a1,@"2":a2,@"3":a3,@"4":a4,@"5":a5};
sorted = [dic1 keysSortedByValueUsingComparator:^NSComparisonResult(id obj1 ,id obj2){
return [obj1 compare:obj2];//从小到大排序
}];
for (NSString *key in sorted){
NSLog(@"%@ = %@",key,dic1[key]);
}
NSLog(@"---------------");
NSDictionary *dic2 = @{@"1":@"one",@"2":@"two",@"3":@"three",@"4":@"four",@"5":@"five"};
sorted = [dic2 keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];//按字母的大小顺序排序
}];
for (NSString *key in sorted){
NSLog(@"%@ = %@",key,dic2[key]);
}
7、Block 和 函数指针 的本质区别
fun();
//Block 和 函数指针 的本质区别
myBlock();//所指向的代码是没有名字的
// void (*pf)() = fun;//函数指针,但是指向的代码要有名字
// pf();
NSLog(@"%lg",myBlock1(2,3));