8

同じブロック型である 1 つのパラメーターを取るブロック型を宣言したいと考えています。それはちょうどこのようなものです:

typedef void (^BlockInBlock) (BlockInBlock block);

私は宣言が無効であることを知っています。しかし、同じブロックタイプのパラメーターを1つだけ取る再帰ブロックを実装する方法があるかどうか疑問に思います。


ブロックを使用して、Objective-C でアスペクト指向プログラミング (AOP) を実装する方法を見つけようとしています。これを実装する方法についての私の質問は次のとおりです。

追加の質問 1:

上記で説明した多くのブロックを取り、最終的に で終わる可変引数関数を実装する方法nil、および nil を満たすまで多くのブロックでその関数を呼び出すことができますか? 次のようになります。

@interface NSObject(AOP)
- (void) invokeBlockInBlock:(BlockInBlock) headBlock, ...{
    va_list blockList;
    va_start(blockList, headBlock);

    // Invoke recursive blocks here until the value of va_arg(blockList, BlockInBlock) is nil
    // it would be like: block1(self, block2(self, block3(self, block4(...))));

    va_end(blockList);
}
@end

追加の質問 2:

再帰ブロックに戻り値がある場合はどうなりますか?


C言語に関する追加の質問:

C関数ポインターである1つのパラメーターを取り、そのC関数ポインターの関数も別のC関数ポインターを取るC関数を宣言することは可能ですか?

4

2 に答える 2

4

__block 参照でブロックをキャプチャすることで、これを行う方がはるかに簡単です。実際、C でのジェネリック型の前方宣言はサポートされていません。それで、これが唯一の解決策かもしれませんか?

__block void(^strawberryFields)();
strawberryFields = ^{ strawberryFields(); };
strawberryFields();

そのブロックを非同期にディスパッチすることを計画している場合は、割り当ての前にコピーする必要があることに注意してください (これはARC では不要になる可能性があります)。

__block void(^strawberryFields)();
strawberryFields = [^{ strawberryFields(); } copy];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),
               strawberryFields);
于 2013-09-13T17:40:38.810 に答える