Block:块语法,本质是匿名函数;
1.结构:void(^block)(void) = ^void(void){实现部分};
^指向符:作用用来声明block类型的变量;
=左面:返回值类型 (^变量名)(参数1 类型 ,参数2 类型...)
=右边 :^[返回值类型,可以不写](参数1类型 参数名,参数2类型 参数名){
实现部分
};
注意:等号左右两侧参数类型一定要一一对应,等号右侧参数类型后边,一定要指定参数名;
2.块语法分类
与函数指针用法相同,有4种类型。
(1)有返回值有参数,
int(^block)(int ,int) = ^int (int a ,int b){
return a + b;
};
int c = block(4,5);
NSLog(@"%d",c);
(2)无返回值无参数,
void(^firstBlock)(void) = ^void(void){
NSLog(@"这是第一个block");
};
firstBlock();
(3)有返回值无参数,
int(^block)(void) = ^int(void)
{
return 33;
};
int b = block();
NSLog(@"%d",b);
(4)无返回值有参数;
void(^block)(int ,int ) = ^void(int a ,int b){
NSLog(@"%d",a + b);
};
block(3,4);
3.typedef
起别名typedef,这是确定一个类型,所以必须写在主函数之上;
主函数上:
typedef int (^MyBlock)(int,int);
主函数中:
MyBlock myBlock = ^int (int a,int b){
return a > b ? a : b;
};
MyBlock yourBlock = ^int (int x, int y){
return x + y ;
};
4.Block与局部变量;
(1)Block默认在全局区,如果Block内部使用了局部变量,那么会将Block拷贝到栈区;
(2) Block内部只能访问局部变量,不能更改;如果想更改局部变量,需要在局部变量声明之前加 上__block,将局部变量拷贝到block所在的栈区中;
注意:有两个_,不是一个;
(3)声明:
__block int num = 10 ;
void(^block)(void)= ^void(void){
NSLog(@"%d",num++);
};
(4)调用;
block();
5.Block与全局变量
(1) 全局变量在静态区,静态区又称全局区;
(2)Block与全局变量的关系,Block内既可以访问全局变量,又可以更改全局变量;
6.Block与数组排序;
(1)例
a.创建数组
NSMutableArray *array =
[NSMutableArray arrayWithObjects:@"32",@"02",@"12",@"10",@"08", nil];
b.使用NSComparator比较规则
NSComparator compareCustomer = ^(NSString * str1 ,NSString *str2)
{
NSLog(@"str1 = %@,str2 = %@",str1,str2);
return -[str1 compare:str2];
};
c.按上述规则将数组array排序,得到一个新的数组
NSMutableArray *result =
[array sortedArrayUsingComparator:compareCustomer];
NSLog(@"%@",result);
(2)NSComparator比较器:返回值,返回当前两个对象比较的状态(升序,降序或相等);
将比较器的返回结果进行判断;如果是降序状态进行交换;
方法默认升序排列,如果想降序,那么将比较器的返回值取反。
7.数组排序的三种方法;
(1)冒泡排序法
for (int i = 0 ; i < array.count - 1; i++) {
for (int j = 0 ; j < array.count - 1 - i; j++) {
if ([array[j] age] > [array[j + 1] age]) {
[array exchangeObjectAtIndex:j withObjectAtIndex:(j+1)];
}
}
}
for (int i = 0; i < array.count; i++)
{
NSLog(@"name :%@ ,age:%ld,number:%ld",[array[i] name],[array[i] age],[array[i] number]);
}
(2)NSSortDescriptor排序法
a.定义排序规则
NSSortDescriptor *sort =
[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
b.按上述规则排序
NSMutableArray *arrayTwo = [array sortedArrayUsingDescriptors:@[sort]];
for (int i = 0; i < arrayTwo.count; i++)
{
NSLog(@"name :%@ ,age:%ld,number:%ld",[arrayTwo[i] name],[arrayTwo[i] age],[arrayTwo[i] number]);
}
注意: 数组中元素交换用exchange;结构体输出用遍历;
(3)NSComparator排序法
注意:参数只能是对象类型,NSInteger等非对象类型不可以,所以要转变;
a.定义排序规则
NSComparator comparator = ^(Student *stu1,Student *stu2){
if (stu1.age > stu2.age) {
return 1L;
}else if(stu1.age < stu2.age){
return -1L;
}else{
return 0L;
}
或
if (stu1.age > stu2.age) {
return NSOrderedDescending;
}else if (stu1.age < stu2.age)
{
return NSOrderedAscending;
}else{
return NSOrderedSame;
}
};
b.按上述规则进行排序
NSArray *arrayTwo = [array sortedArrayUsingComparator:comparator];
for (Student *stu in arrayTwo) {
NSLog(@"name :%@ ,age:%ld,number:%ld",[stu name],[stu age],[stu number]);
}