block

    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的运用实战,我会再接着总结....

    












你可能感兴趣的:(block)