Block
来源:互联网 发布:深圳牛掰seo 编辑:程序博客网 时间:2024/06/16 13:56
C的函数指针
typedef void (*pType)(); //将函数指针类型void (*)() 重命名为pTypevoid fun(){NSLog(@"fun");}void fun1(){NSLog(@"fun1");}
//1. 在形参中声明函数指针变量
//2. 形参中的函数指针变量指向实参的函数名(间接指向)
//3. 函数指针变量调用函数 – 函数回调
void FunMain(pType p){ p(); //函数回调, 传入哪个函数名,那么回调哪个函数}int main(int argc, const char * argv[]) {@autoreleasepool { // insert code here... //fun(); //普通C函数调用
//函数指针的使用步骤:
//1.声明函数指针变量;(声明要与要调用的函数的返回值及参数类型匹配) //2.函数指针变量指向函数名; //3.函数指针调用函数名
//函数指针的第一种调用方法:直接指向函数名
if 0 void (*p)(); p = fun; p(); //--调用fun函数 p = fun1; p(); //--调用fun1函数endif
//函数指针的第二种用法: 间接指向函数名(传参形式指向指向函数名)
FunMain(fun); FunMain(fun1);
block的基本用法
//block的使用步骤:
//1. 声明block变量; //2. block变量指向block块 //3. block变量调用块中的内容
//block的第一种使用方式: block变量直接指向block块
//a. 声明一个无参数无返回值的block变量 void (^block)(); //声明无参无返回值的block变量 block = ^{ //无参无返回值的block块: ^{} NSLog(@"222"); NSLog(@"无参数无返回值的block"); }; NSLog(@"111"); block(); //block调用无参数的块中的内容 NSLog(@"333"); //b.声明一个有参数无返回值的block变量 void (^block1)(NSInteger a); //声明有参的block block1 = ^(NSInteger a){ //有参的block块:^(参数){} NSLog(@"a= %ld",a); }; block1(5); //block调用有参数的块中的内容 //c.声明一个有参数有返回值的block变量 NSInteger (^block2)(NSInteger a);//声明有参有返回值的block NSInteger b = 4; __block NSInteger c = 6; //加入__block,在block块中c变成可读可写 block2 = ^NSInteger(NSInteger a){ //有参有返回值的block块:^类型(参数){} //b = 5; err 外部的变量,可读不可写 c = 7; //__block修饰后,可读可写 NSLog(@"有参有返回值 a = %ld",a+b); //在块中可使用外部的变量 return 1; }; NSLog(@"返回值:%ld",block2(3));
block test
//1.声明一个有参数有返回值的block
NSString * (^block)(NSString *str);
//2.block变量指向block块
block = ^NSString *(NSString *str){ NSMutableString *mutStr = [[NSMutableString alloc] init]; NSInteger len = [str length]; //获取传入字符串长度 for(NSInteger i=len-1;i>=0;i--) { //根据下标获取字符串的每个字符,存储到可变字符串中 [mutStr appendFormat:@"%c",[str characterAtIndex:i]]; } return mutStr; };
//3.block调用block块内容
NSLog(@"逆序后:%@",block(@"hello"));
block作为函数参数使用
//需求: 打印每个人的说话; //A说: ABC //B人说: BCA //C说:CAB/* 弊端: 类中方法太多 Person *baoA = [[Person alloc] init]; baoA.name = @"A"; [baoA baoAnSay]; //A说: Person *gongR = [[Person alloc] init]; gongR.name = @"B"; [gongR gongRenSay]; //B说: Person *yuan = [[Person alloc] init]; yuan.name = @"C"; [yuan yuanSay]; //C说: */ //block的第二种用法: block间接指向block块 (重点) (以参数形式使用block) Person *baoA = [[Person alloc] init]; baoA.name = @"baoAn"; [baoA allSay:^(NSString *name) { NSLog(@"%@说:一个月挣800多",name); }]; Person *gongR = [[Person alloc] init]; gongR.name = @"gongRen"; [gongR allSay:^(NSString *name) { NSLog(@"%@说:ABC",name); }]; Person *yuan = [[Person alloc] init]; yuan.name = @"BCA"; [yuan allSay:^(NSString *name) { NSLog(@"%@说:CAB",name); }]; //Block作用: 统一接口的调用、方便界面间的传值 _int32er_ a = 5; //typedef中int重命名的类型 _int32er_ NSLog(@"a = %d",a);
//void (^)(NSString *))->block的类型
//1. 声明block变量: void (^block)(NSString * name)
//2. 形参的block变量,指向实参的block: block-> ^(NSString *name){}
-(void)allSay:(blockType)block{block(_name); //3.block回调->通过block变量调实参块中的内容}
使用block完成数组排序
//#import <Foundation/Foundation.h>void sortLength(NSMutableArray * mutArr){NSInteger count = [mutArr count];//冒泡排序法: 总共比较count-1次for(NSInteger i=0;i<count-1;i++){ //每次循环count-i-1 for(NSInteger j=0;j<count-i-1;j++) { //每次两两相比较,最大的数放右边 if([mutArr[j] length]>[mutArr[j+1] length]) { //交换相邻两数 [mutArr exchangeObjectAtIndex:j withObjectAtIndex:j+1]; } }}}void sortAscii(NSMutableArray *mutArr){NSInteger count = [mutArr count];//冒泡排序法: 总共比较count-1次for(NSInteger i=0;i<count-1;i++){ //每次循环count-i-1 for(NSInteger j=0;j<count-i-1;j++) { //每次两两相比较,最大的数放右边 if(NSOrderedDescending == [mutArr[j] compare:mutArr[j+1]]) { //交换相邻两数 [mutArr exchangeObjectAtIndex:j withObjectAtIndex:j+1]; } }}}
//使用block的步骤:
//1.声明block变量
//2.block变量指向实参的block块
void sortForBlock(NSMutableArray *mutArr,NSInteger (^block)(NSString *obj1,NSString *obj2))
{
NSInteger count = [mutArr count];
//冒泡排序法: 总共比较count-1次for(NSInteger i=0;i<count-1;i++){ //每次循环count-i-1 for(NSInteger j=0;j<count-i-1;j++) { //每次两两相比较,最大的数放右边 if(block(mutArr[j],mutArr[j+1])) //通过block回调,将两个字符串传出;自定义做判断 { //交换相邻两数 [mutArr exchangeObjectAtIndex:j withObjectAtIndex:j+1]; } }}}int main(int argc, const char * argv[]) {@autoreleasepool { // insert code here... NSMutableArray *mutArr = [[NSMutableArray alloc] initWithObjects:@"11111",@"2222",@"33",@"4",@"555555",@"666", nil];
方法1.直接通过冒泡排序可求出,但是冗余太多
sortLength(mutArr); //按照字符串长度排序 NSLog(@"字符串长度排序:%@",mutArr); sortAscii(mutArr); //按ascii码排序 NSLog(@"ascii排序:%@",mutArr);
方法2: 通过自定义block来完成排序
sortForBlock(mutArr, ^NSInteger(NSString *obj1, NSString *obj2) { //block块的内容中,实现比较的判断 //按照字符串转整数值判断 if([obj1 intValue] > [obj2 intValue]) { return 1; } return 0; }); NSLog(@"按整数值排序:%@",mutArr); //通过自定义block来完成排序 sortForBlock(mutArr, ^NSInteger(NSString *obj1, NSString *obj2) { //block块的内容中,实现比较的判断 //按照字符串的ascii来判断 if(NSOrderedDescending == [obj1 compare:obj2]) { return 1; } return 0; }); NSLog(@"按字符串的ascii排序:%@",mutArr);
//方法3:系统提供的排序方法
[mutArr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { //按照长度排序: if([obj1 length]>[obj2 length]) { return NSOrderedDescending; } return NSOrderedSame; }]; NSLog(@"按长度排序:%@",mutArr);}return 0;}
0 0
- Block
- block
- Block
- block
- block
- block
- block
- block
- block
- Block
- block
- Block
- Block
- Block
- Block
- block
- Block
- block
- 腾讯2017暑期实习生编程题——算法基础-字符移位
- 利用JQuery操作form表单,例如:text,radis,checkbox,file等等之类的
- Javascript模块化编程(一):模块的写法
- js--DOM2--元素遍历
- Android代码混淆总结
- Block
- 学习笔记之JavaSE(17)--面向对象编程8
- ExpandableListView (二级列表)使用demo
- 闭包的概念(js)
- 【WebView】加载本地html及远程URL
- IOS学习笔记(页面传值:属性传值,协议代理传值,闭包传值)
- File "/etc/resolv.conf" is not consistent across nodes
- Fresco 一个强大的图片加载框架
- Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE