一 .Block简介
Block:块语法, 本质上是匿名函数(没有名称的函数)
标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数。
C++、JS、Swift等语言,有类似语法,叫做闭包。
Block语法和函数指针很相似。
Block语法:如下图
int m = 7; int (^myBlock)(int) = ^(int num) { return num * m; };
Block详细
Block类型:int (^)(int)
Block变量:myBlock
Block值:^int (int num){return 7 *num;}
即:^返回值类型 (参数列表) {函数体} 其中返回值类型可以省略
二. Block使用
int (^block1)(int, int) = ^(int x, int y) { return x + y; }; int a = block1(32, 34);//block的使用和函数指针的使用类似 NSLog(@"%d", a); //打印结果: 66
Block进行typedef
typedef int (^BlockType) (int x, int y) //原类型:int (^) (int, int) //新类型:BlockType int (^block1)(int, int) = ^(int x, int y) { return x + y; }; //等价于 BlockType block1 = ^(int x, int y) { return x + y; };
Block与局部变量
int main(int argc, const char * argv[]) { @autoreleasepool { //block内部, 可以使用外界的局部变量 int num = 1; void (^addNum)(void) = ^(void) { int c = num * 10; NSLog(@"%d", c); }; //调用Block addNum(); } return 0; }
注意:Block内部不能修改局部变量
int num = 1; void (^addNum)(void) = ^(void) { num ++;//错误:不能修改局部变量 NSLog(@"%d", num); }; //调用Block addNum(); NSLog(@"%d", num); }
注意:添加__block修饰后可以修改局部变量
__Block int num = 1; void (^addNum)(void) = ^(void) { num ++;//错误:不能修改局部变量 NSLog(@"%d", num); }; //调用Block addNum(); NSLog(@"%d", num); }
Block与全局变量
//全局变量 int count = 200; int main(int argc, const char * argv[]) { @autoreleasepool { //1.在Block块语法中访问全局变量 void (^addNum)(void) = ^(void) { //可以访问到全局变量,并且可以修改全局变量 count ++; NSLog(@"%d", count); }; //调用Block addNum(); //显示结果 NSLog(@"%d",count); } return 0; }
三. Block与数组排序
//Block数组排序 NSArray *stringArray = [NSArray arrayWithObjects:@"abc10", @"abc21", @"abc12",@"abc13", @"abc05", nil]; NSComparator sortBlock = ^(id string1, id string2) { return [string1 compare: string2]; }; NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock]; NSLog(@"%@", sortArray);
Block对Student对象排序
students是一个NSMutableArray对象,包含若干个Student对象。按student的age进行排序。
[students sortUsingComparator:^NSComparisonResult(id obj1,id obj2){ Student *stu1 = (Student *)obj1; Student *stu2 = (Student *)obj2; if([stu1 age] > [stu2 age]){return NSOrderedDescending;} else if([stu1 age] < [stu2 age]){return NSOrderedAscending;} else {return NSOrderedSame;} }];