Block

C的函数指针

typedef void (*pType)();  //将函数指针类型void (*)()  重命名为pType

void 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值