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
原创粉丝点击