iOS 参数传递block和函数

搞iOS开发的同学都知道,在做回调的时候,通常用代理或者是block,本文不讲代理,只讲block。

//测试OC区块作为参数的方法
-(void)testOCBlock {
    //...
    [self callOCBlock:^(NSInteger num) {
        NSLog(@"---%ld", (long)num);
    }];
}
//接收一个OC区块作为参数
-(void)callOCBlock:(typeof(void(^)(NSInteger)))ocblock {
    //...
    ocblock(20);
}

这是很常见的将block当成参数传递给oc的方法中再执行block。

那是不是可以将C语言作为函数的参数进行传递呢?答案是可以的。

//测试C函数作为参数的方法
-(void)testCFun {
    //...
    [self callCFun:cfun];
}
//定义一个函数参数
void cfun(NSInteger num) {
    NSLog(@"---%ld", (long)num);
}
//接收一个C函数作为参数
-(void)callCFun:(typeof(void(*)(NSInteger)))cfun {
    //...
    cfun(20);
}

将C语言作为的函数作为参数也只是为了那些不想用代理,而方法体处理的逻辑不短的一种解决问题方式之一。

另外,在通过别名的方式定义OC区块的时候,用的是这样的方式:

//定义一个OC的Block类型
typedef void(^OCBlock)(NSInteger num);

那又如何通过别名的方式定义C语言的函数呢?

//定义一个C的类型
typedef void(*CFun)(NSInteger num);
//typedef void*CFun(NSInteger num);//也可以

可以看到两种定义真的很像,只有一个^*的差别。

使用的时候就是把它当成普通的类型即可;

//定义一个C的函数类型
typedef void(*CFun)(NSInteger num);
//定义一个OC的Block类型
typedef void(^OCBlock)(NSInteger num);
-(void)doCFun:(CFun)cfun {
    cfun(10);
}
-(void)doBlock:(OCBlock)block {
    block(10);
}

仅此做一个笔记。

你可能感兴趣的:(iOS 参数传递block和函数)