2

@selector可変引数リストを使用するメソッドでand performSelector:(または同様のもの)を使用することは可能ですか?

デフォルトの動作をオーバーライドするデリゲートを割り当てることができるクラスを作成しています。デリゲートが存在する場合、そのクラスのインスタンスに対して行われた select メソッドの呼び出しは、同じ対応するデリゲート メソッドに転送されます。その一部は可変引数リストを使用します。

したがって、たとえば、次SELのようなメソッドを使用して、参照を取得し、デリゲート オブジェクトにメッセージを送信できるようにする必要があります。

- (void)logEventWithFormat:(NSString *)format, ... {
    va_list argList;
    id del = self.delegate;
    if (del != nil && 
        [del conformsToProtocol:@protocol(AProtocolWithOptionalMethods)] &&
        [del respondsToSelector:@selector(logEventWithFormat:)])
    {
        // Perform selector on object 'del' with 'argList'
    }
}

これは不可能であると想定しているため、Foundation フレームワークでの同様のメソッド宣言 - in NSString:

- (id)initWithFormat:(NSString*)format, ...;

- (id)initWithFormat:(NSString *)format arguments:(va_list)argList;

委譲したいプロトコルは、次の実装を提案する必要があると思います。

- (void)logEventWithFormat:(NSString *)format arguments:(va_list)argList;

だから私はセレクター@selector(logEventWithFormat:arguments:)を使用して呼び出すことができます:

[del performSelector:@selector(logEventWithFormat:arguments:) 
          withObject:format
          withObject:argList];

私は何かを見逃していたのか、それとも私がやろうとしていることを達成するために長い道のりを歩んでいたのか疑問に思いました.

4

4 に答える 4

4

必要なものは何でもランタイム関数に渡すことができますobjc_msgSend

objc_msgSend(del, @selector(logEventWithFormat:arguments:), format, argList);

これは、手動で作成されたメッセージを送信する最も強力な方法です。

ただし、この方法で呼び出しを実行する必要があるかどうかは明確ではありません。KennyTM が指摘したように、あなたが持っているコードでは、メソッドを直接呼び出すことができます。

于 2010-01-26T08:58:58.157 に答える
2

は単に「オブジェクト」ではない-performSelector:withObject:withObject:ため、使用できません。va_listを使用する必要がありますNSInvocation

または単に電話する

[del logEventWithFormat:format arguments:argList];
于 2010-01-26T06:20:52.820 に答える
2

私の知る限り、それはできません。-performSelector:withObject:withObject:@KennyTM が指摘しているように、 ava_listはオブジェクトではないため、使用できません。

ただし、 も使用できませんNSInvocationドキュメントには、次のように書かれています。

NSInvocation は、可変数の引数または共用体引数を使用したメソッドの呼び出しをサポートしていません。

va_listこれらはセレクターによってメソッドを呼び出す 2 つの方法であり、どちらも機能していないように見えるため、メソッドを直接呼び出して引数として渡さない限り、「実行できません」という回答を使用します。

おそらく @bbum が現れて、私たちをさらに啓発してくれるでしょう。=)

于 2010-01-26T07:01:14.677 に答える
0

私は以前にそのようにしたことはありませんが、私がよく使用する簡単な解決策は、withObject パラメーターの NSMutableArray または NSMutableDictionary のいずれかをボックス化/ボックス化解除することです。

于 2010-01-26T06:11:01.820 に答える