block是苹果最推崇的语法,IOS4.0之后的类都添加了block支持。block通常当参数来使用
block的本质上是匿名函数(没有名称的函数)。
下面让我们来写一个最基本的block
一、声明一个block
// 返回两个整数的和
int (^sumBlock) (int, int) = ^(int num1, int num2)
{
return num1 + num2;
};
分析一下block的结构:int 代表block的返回值类型, (^sumBlock)代表block的对象名, (int, int)代表block变量有几个参数,参数的类型是int, ^(int num1, int num2)代表参数名, {}的内容代表block的主体
二、使用block
NSLog(@"sum = %d", sumBlock(10, 20));// block的使用和函数指针的使用类似
直接使用block对象就可以了
三、block与typedef
使用typedef重命名上述求和的block
// block进行typedef
typedef int (^BlockType)(int, int);
使用BlockType声明对象并实现
BlockType blockType = ^(int num1, int num2)
{
return num1 + num2;
};
这里说一下,我们在实际开发中,基本不会用到typedef修饰block。
四、block与局部变量
1、block的主体是不能修改局部变量的值的
2、block的主体可以修改用__block修饰的局部变量的值
__block int count = 100;
BlockType blockType = ^(int num1, int num2)
{
count++;
return num1 + num2;
};
五、block与全局变量
block的主体可以修改全局变量
六、利用block遍历数组
// 声明一个不可变数组
NSArray *array = @[@"字符串1", @"字符串2", @"字符串3", @"字符串4", @"字符串5"];
// 使用NSArray提供的方法遍历数组
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"array[%lu] = %@", idx, obj);
}];
遍历的结果为:
2015-05-21 21:22:12.409 Test02[2803:230861] array[0] = 字符串1
2015-05-21 21:22:12.410 Test02[2803:230861] array[1] = 字符串2
2015-05-21 21:22:12.410 Test02[2803:230861] array[2] = 字符串3
2015-05-21 21:22:12.410 Test02[2803:230861] array[3] = 字符串4
2015-05-21 21:22:12.410 Test02[2803:230861] array[4] = 字符串5
七、利用block对数组进行排序(数组元素是Person类)
对字符串进行升序排列,代码如下
// 声明多个Person对象
Person *p1 = [Person personWithName:@"zhangsan" number:10001 age:26 score:90.5];
Person *p2 = [Person personWithName:@"lisi" number:10002 age:22 score:91.5];
Person *p3 = [Person personWithName:@"wangwu" number:10004 age:24 score:90.5];
Person *p4 = [Person personWithName:@"zhaoliu" number:10003 age:25 score:92.5];
Person *p5 = [Person personWithName:@"xiaoqi" number:10008 age:26 score:96.5];
Person *p6 = [Person personWithName:@"bazai" number:10006 age:27 score:93.5];
Person *p7 = [Person personWithName:@"xiaojiu" number:10005 age:21 score:92.5];
Person *p8 = [Person personWithName:@"shidi" number:10007 age:18 score:99.5];
// 声明一个不可变数组
NSArray *persons = [NSArray arrayWithObjects:p1, p2, p3, p4, p5, p6, p7, p8];
// 按照姓名升序排列
NSArray *sortName = [persons sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
return [[obj1 name] compare:[obj2 name]];
}];
NSLog(@"%@", sortName);
排序后的结果:
2015-05-22 10:50:04.966 Test02[899:48192] (
"name = bazai number = 10006 age = 27 score = 93.50",
"name = lisi number = 10002 age = 22 score = 91.50",
"name = shidi number = 10007 age = 18 score = 99.50",
"name = wangwu number = 10004 age = 24 score = 90.50",
"name = xiaojiu number = 10005 age = 21 score = 92.50",
"name = xiaoqi number = 10008 age = 26 score = 96.50",
"name = zhangsan number = 10001 age = 26 score = 90.50",
"name = zhaoliu number = 10003 age = 25 score = 92.50"
)
sortedArrayUsingComparator方法的参数就是一个block,这就是把block当成参数的使用,也是对block最常用的方式
对number进行升序排列,代码如下:
// 按number进行升序排列
NSArray *sortAge = [persons sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// 个人的理解:
// 数组中前一个元素的number属性比数组中后一个元素的number属性大的场合
// 相对于这两个元素而言是降序的顺序,所以把NSOrderedDescending返回,方法会将obj1与obj2对换位置
if ([obj1 number] > [obj2 number]) {
return NSOrderedDescending;
} else if ([obj1 number] < [obj2 number]) {
return NSOrderedAscending;
} else {
return NSOrderedSame;
}
}];
NSLog(@"%@", sortAge);
排序后的结果:
2015-05-22 11:22:45.334 Test02[1050:60369] (
"name = zhangsan number = 10001 age = 26 score = 90.50",
"name = lisi number = 10002 age = 22 score = 91.50",
"name = zhaoliu number = 10003 age = 25 score = 92.50",
"name = wangwu number = 10004 age = 24 score = 90.50",
"name = xiaojiu number = 10005 age = 21 score = 92.50",
"name = bazai number = 10006 age = 27 score = 93.50",
"name = shidi number = 10007 age = 18 score = 99.50",
"name = xiaoqi number = 10008 age = 26 score = 96.50"
)
那么降序排列的方法就是当第一个元素的属性小于后一个元素的属性的场合,将两个元素对换位置:
对score进行降序排列,代码如下:
// 按score进行降序排列
NSArray *sortScore = [persons sortedArrayUsingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
if ([obj1 score] < [obj2 score]) {
return NSOrderedDescending;
} else if ([obj1 score] > [obj2 score]) {
return NSOrderedAscending;
} else {
return NSOrderedSame;
}
}];
NSLog(@"%@", sortScore);
排序后的结果:
2015-05-22 11:42:41.781 Test02[1131:67745] (
"name = shidi number = 10007 age = 18 score = 99.50",
"name = xiaoqi number = 10008 age = 26 score = 96.50",
"name = bazai number = 10006 age = 27 score = 93.50",
"name = zhaoliu number = 10003 age = 25 score = 92.50",
"name = xiaojiu number = 10005 age = 21 score = 92.50",
"name = lisi number = 10002 age = 22 score = 91.50",
"name = zhangsan number = 10001 age = 26 score = 90.50",
"name = wangwu number = 10004 age = 24 score = 90.50"
)
总结一下:block在做IOS应用程序的时候,会经常使用block做方法的参数。
block的应用场合:
1.遍历数组和字典
2.排序
3.视图动画
4.通知
5.错误处理
6.多线程等等.....