block在iOS4.0的时候,被苹果主推了.block在很多语言都有,在C++里面,叫做闭包,在苹果新是的语言Swife里面也叫闭包,用的这么广,所以我们很有必要学好它
block也可以叫做匿名函数,既然是函数,肯定有函数定义和函数调用.
学习一个知识点,我们首先知道要怎么去定义它.
在这里,我先说下怎么定义一个block.
定义包括三元素,类型,变量名,赋初值,在这里也不例外.
类型
int(^)(NSString *,NSString *)//可以带形参
变量名
block
初值
赋值的时候,可以省略返回值,注意必须保证return的值跟返回值匹配
^(NSString * a, NSString * b){
};
连起来写
int(^block)(NSString * str1,NSString * str2)=^(NSString * str1,NSString * str2){
return [str1 intValue] + [str2 intValue];
};
再就是block调用
block(@"str1",@"str2");
知道了怎么定义block,在看怎么运用block..
block需要注意问题,
for example :
int m = 10;
int(^block)(int a,int b)= ^(int a,int b){
m = 20;
return a+b+m;
};
当在block内部修改变量值时,系统会报错,
注意,block内部的变量不能修改,如果真要修改,那么你就加__block 修饰(__block int m =20) ;
为啥不能修改
函数体内定义的变量在栈区
因为 block 会对block内的变量拷贝,放到栈区的才会被拷贝, 栈区的m会被系统释放了,所以不能修改.
而放到全局区,静态区不会拷贝,
__black 为啥可以改值
相当于static,
直到程序运行过程中一直存在,直到程序结束才被释放;
二,black 运用 作为其他函数的参数,参与回调,传值,排序,动画等等
下面说一下关于block排序
Student * stu1 = [[Student alloc]initWithName:@"zuoyoudong" age:24]; Student * stu2 = [[Student alloc]initWithName:@"zhangsan" age:5]; Student * stu3 = [[Student alloc]initWithName:@"lisi" age:30]; Student * stu4 = [[Student alloc]initWithName:@"zhaoxin" age:29]; NSArray * array1 = [[NSArray alloc]initWithObjects:stu1,stu2,stu3,stu4 ,nil]; NSArray * sortStuArray = [array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { //如果不想单独写一个比较方法,可以直接在里面比较 // if ([obj1 age] > [obj2 age]) { // return NSOrderedAscending; // }else if ([obj1 age]<[obj2 age]){ // return NSOrderedDescending; // }else{ // return NSOrderedSame; // } return [[obj1 name]compare:[obj2 name]]; }]; //要检查排序后方法对不对,就按照下面这样写 NSLog(@"%@",[[sortStuArray objectAtIndex:3]name]);技巧总结.如果要求倒序排序,下面两个方法可以实现:
//加个减号,即是倒序,
//[obj2 compare:obj1]也是倒序
另外最后说一下,iOS官方文档一般都是用typedef来定义,具体如下:
typedef int (^p)(int,int);
//这里的p就代表了black的类型 ,后面只要有变量名和赋初值就行了
p block2 = ^int (int x, int y){
return x + y;
};
后续用到block的运用实战,我会再接着总结....