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);
}

仅此做一个笔记。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容