OC之Block的初级学习

来源:互联网 发布:二战伪军数量知乎 编辑:程序博客网 时间:2024/04/29 23:33
#import <Foundation/Foundation.h>  #import "Student.h"  typedef int(^BlockType)(int,int);  int globalVariable = 200;  int main(int argc, const charchar * argv[])  {      @autoreleasepool {          /*          Block学习:初级block,关于高级block将在UI阶段          关于block语法,参考其他资料          作用:          Block封装了一段代码,可以在任何时候执行          Block可以作为函数参数或者函数的返回值,而本身又可以带输入参数或返回值          block,在多线程、异步任务,集合遍历,集合排序、动画专场用得多          */          //int (int a,int b)表示匿名函数的类型          //int (^ )(int a,int b)表示Block的类型          //myBlock实现的是匿名函数的实现体部分          int (^ myBlock)(int a ,int b) =^int(int a ,int b){              return a+b;          };//这里需要加分号,因为这整个部分相当于一个赋值语句,大括号内容赋值给块变量myBlock          //按照调用函数的方式调用块对象          int value =   myBlock(3,5);//通过myBlock实现两个整型数的求和,返回值为int          NSLog(@"%d",value);  //写⼀个 返回值为整型 参数为NSString(仅⼀一个参数)的block,实现将字符串转换为整型的功能.          int (^strBlock)(NSString *str)=^int(NSString *str){          int value =[str intValue];          return value;              };          NSString *str = @"123";          //使用block          NSLog(@"%d",strBlock(str));  //练习,定义三个block求商/差/积          int (^cutBlock)(int ,int )=^int(int a,int b){              return a-b;          };          int (^dealerBlock)(int ,int)= ^(int a,int b){              return  a%b;          };          int (^rideBlock)(int,int ) = ^(int a,int b){              return a*b;          };          NSLog(@"%d",cutBlock(3,5));          NSLog(@"%d", dealerBlock(3,5));          NSLog(@"%d",rideBlock(3,5));         //对于上面三个函数的类型都一样,所以可以引入typedef来在#import下面进行重定义  #pragma mark----给相同block类型进行重命名          BlockType myBlock1 = ^int(int a,int b){//对于^后面的int可以省略,但是系统默认的是int型,所以如果是其他类型一定要写上              return a-b;          };          NSLog(@"%d",myBlock1(4,5));          //.....  #pragma mark----block与全局变量        //定义一个全局变量globalVariable          void (^block)(void) = ^(){//^(void)(),前面的返回值类型void可以省略,但是后面的括号语法上定义是不可以省略(),但是经过测试没有参数也可以省略              globalVariable++;//如果是全局变量可以直接被访问和修改              NSLog(@"%d",globalVariable);          };          block();  #pragma mark----block与局部变量         // int number =1;//局部变量需要加__block,否则会提示出错        __block  int  number = 1;          void (^block1)(void) = ^(){              number++;//如果是局部变量不可以直接被访问和修改,必须在number前面加一个__block,这里需要打两个小_              NSLog(@"%d",number);          };          block1();  #pragma mark----block自动截取变量          int val = 10;          void (^blk)(void) = ^(){             // printf("val=%d\n",val);              NSLog(@"%d",val);          };          val = 2;          blk();  //上面这段代码,输出值是:val = 10.而不是2.block截获自动变量的瞬时值。因为block保存了自动变量的值,所以在执行block语法后,即使改写block中使用的自动变量的值也不会影响block执行时自动变量的值。  #pragma mark----block与数组排序          //关于数组的排序已经总结过,这里做一个比较  //使用系统自带compare比较系统自带对象          NSArray *strsArray =[NSArray arrayWithObjects:@"abc",@"cdf",@"ade",@"feg", nil nil];          NSArray *newArray = [strsArray sortedArrayUsingSelector:@selector(compare:)];          NSLog(@"%@",newArray);  //使用block方式比较系统自带对象          //该种方式是按block的语法按步骤来进行比较的,下面背注掉的是使用简便的方式,两者原理一样          NSComparisonResult(^strBlock1)(id obj1,id obj2)=^NSComparisonResult(id obj1,id obj2){              NSString *result1 = (NSString *)obj1;              NSString *result2 = (NSString *)obj2;              return [result1 compare:result2];          };          NSArray *resut3 = [strsArray sortedArrayUsingComparator:strBlock1];//strBlock1          NSLog(@"%@--",resut3);  //       NSArray *sortArray = [strsArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {^NSComparisonResult(id obj1, id obj2)相当于上面的strBlock1  //           NSString *result1 = (NSString *)obj1;  //           NSString *result2 = (NSString *)obj2;  //           return [result1 compare:result2];  //        }];  //        NSLog(@"%@",sortArray);          //对于系统自带的对象和类都可以用compare方法,但是自定义的类需要自己重写compare方法          //使用自定义compare方法对数组中得对象按照年龄进行排序,(数组中的对象为自定义类型的对象)          Student *stu1 = [Student studentWithName:@"刘亦菲" Age:26 Score:89.0];          Student *stu2 = [Student studentWithName:@"张飞" Age:34 Score:78.0];          Student *stu3 = [Student studentWithName:@"周冬雨" Age:22 Score:85.0];          NSMutableArray *stusarray = [NSMutableArray arrayWithObjects:stu1,stu2,stu3 , nil nil];          [stusarray sortUsingSelector:@selector(studentCompare:)];          for (NSString * str in stusarray) {              NSLog(@"%@",str );          }  //使用block方式对数组中得对象按照年龄进行排序,(数组中的对象为自定义类型的对象)          [stusarray sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {              Student *stu1 = (Student *)obj1;//强制转换成自定义类型              Student *stu2 = (Student *)obj2;              return  [stu1 studentCompare:stu2];          }];          for (NSString *stri in stusarray) {              NSLog(@"%@",stri);          }   //使用自定义的block实现对数组中的对象进行排序,基本处理方式与上述的处理系统对象相似,只是如果不知道参数类型必须进行强制转换         NSComparisonResult(^stuBlock)(id ob1,id ob2) =^ NSComparisonResult(id ob1,id ob2){          Student *stud1 = (Student *)ob1;//强制转换          Student *stud2 = (Student *)ob2;             return [stud1 studentCompare:stud2];         };          [stusarray sortUsingComparator:stuBlock];//调用自定义块          for (NSString *stri in stusarray) {              NSLog(@"%@",stri);          }           }      return 0;  }  
0 0
原创粉丝点击