iOSパラメータはblockと関数を渡します

1328 ワード

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

2つの定義は本当に似ていて、1つの^*の違いしか見えません.
使うときは普通のタイプとすればいいです.
// 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);
}

これだけメモをとる.