OC之Block的初级学习
2015-11-02 20:25
267 查看
#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的语法按步骤来进行比较的,下面背注 4000 掉的是使用简便的方式,两者原理一样 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; }
相关文章推荐
- OC - 9.基于Quartz2D绘制下载进度条(demo)
- oc 的一些概念
- [代码例程] iPhone开发入门(7)--- 从C/C++语言到Objective-C语
- IOS 面试习题 Object-C
- objective-c block 讲解
- IOS求职之OC面试题
- iOS OC和Swift混编
- OC_继承,初始化
- OC 省市区划分
- iOS开发 — Quartz 2D知识点应用 (制作了一个Demo,源代码)
- 编写 Objective-C 代码/掌握基本的编程技能 之 读后笔记
- 利用UIScrollView实现展示图片的无限滚动及自动滚动
- Objective-C 类,对象,属性,方法
- Objective - C 字符串 数组 字典 集合的基本使用
- 图形上下文解释CGContextSaveGState/CGContextRestoreGState
- Objective-C更改placeholder字体颜色
- Objective-C关键字self和super详解
- 字符串的获取
- 1.c++中与oc中类和对象创建及访问
- 2.c++与objective-c中的构造方法(构造函数)