美文网首页
iOS 参数传递block和函数

iOS 参数传递block和函数

作者: George2016 | 来源:发表于2018-06-20 16:01 被阅读2361次

    搞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和函数

          本文链接:https://www.haomeiwen.com/subject/rrjxyftx.html