私はあなたが観察するオブジェクトとプロパティを登録するクラスを作成しています。プロパティがnil
以外に設定されると、登録されたコールバックセレクタが呼び出されます(target-actionなど)。セレクタには3つの異なるシグネチャがあり、正しいシグネチャは登録されたタイプに応じて呼び出されます。Objective-cでランタイムを取得するには?
これはうまくいきましたが、セレクタではなくブロックを「コールバック関数」として登録する機能を追加したいと考えています。与えられたブロックの関数シグネチャを見つけ出し、与えられたブロックのタイプに応じてコールバックを違って処理することは可能ですか?例えば
:
- (void)registerCallbackBlock:(id)block
{
if ([self isBlock:block] {
if ([self isMethodSignatureOne:block]) { /* */ }
else if ([self isMethodSignatureTwo:block]) { /* */ }
else { assert(false); } // bad Block signature
block_ = block; // assuming ARC code
}
else { assert(false); } // not a block
}
- (void)callBlock
{
if ([self isMethodSignatureOne:block_] {
block_(arg1_, arg2_); // needs casting?
}
else if ([self isMethodSignatureTwo:block_) {
block_(arg1_, arg2_, arg3_); // needs casting?
}
}
任意のアイデア?
私は特定のtypedef
のブロック引数を使って異なるレジスタ関数を作ることができると知っていますが、可能であれば単なる関数を持っています。
余分な引数は無視されるだけなので、本当に1または2が入っていても、3つの引数があったとしても構わないかもしれません。 – user102008