1.Block的定义
Block:块语法,本质上是匿名函数(没有名称的函数)
Block的类型
返回值类型(^)(参数类型1 参数名1, 参数类型2 参数名2...)
注:(1)即使没有参数, 括号也不能省略
(2)参数名一般省略, 特殊情况为了使用方便, 参数名不省略
int (^)(int, int)
Block的定义
注:block的名字写在^后面
int (^blockName)(int, int);
Block赋值(block的实现)
^(参数类型1 参数名1, 参数类型2 参数名2, ...) {
执行代码块
}
注:1.参数名不能省略
2.如果block有返回值, 用return返回
blockName = ^(int a, int b) {
return a + b;
};
int (^blockName1)(int, int) = ^(int a, int b) {
return a + b;
};
2.Block的使用
//block名(实参1, 实参2, ...)
int sum = blockName(1, 2);
NSLog(@"%d", sum);
//练习,写一个block, 用于实现打印Hello World
void (^blockName2)() = ^() {
NSLog(@"Hello World");
};
blockName2();//会打印Hello World
//typedef重新命名block
//typedef重命名block时和c语言中的函数指针类似
typedef void (^BlockType)();
BlockType helloWorld = ^() {
NSLog(@"Hello World!");
};
helloWorld();
//block中变量的使用
//1.block内部访问局部变量, 需要加修饰词__block, __weak
//2.block内部可以访问全局变量
//ARC模式下对象用__weak, 基本数据类型用__block
//MRC模式下全部用__block
//做个练习
__block int number = 100;
//block, 每次执行block, 修改number的值(+1), 并打印
void (^addNum)() = ^() {
number++;
NSLog(@"%d", number);
};
addNum();
3.Block实现数字排序
//用block对数组进行升序排列
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"12345", @"432", @"222", @"1", @"999", nil];
NSArray *sortArray = [array sortedArrayUsingSelector:@selector(compare:)];
sortArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 intValue] > [obj2 intValue]) {
return NSOrderedDescending;//前一个大
} else if ([obj1 intValue] < [obj2 intValue]) {
return NSOrderedAscending;//后一个大
}else {
return NSOrderedSame;//相等
}
}];
NSLog(@"%@", sortArray);
//用block对数组进行降序排列
NSArray *array1 = @[@1.2, @10.3, @5.9, @6.6, @8.4];
NSArray *sortArray1 = [array1 sortedArrayUsingSelector:@selector(compare:)];
sortArray1 = [array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
if ([obj1 floatValue] < [obj2 floatValue]) {
return NSOrderedDescending;
} else if ([obj1 floatValue] > [obj2 floatValue]) {
return NSOrderedAscending;
} else {
return NSOrderedSame;
}
}];
NSLog(@"%@", sortArray1);