@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];
私は何かを見逃していたのか、それとも私がやろうとしていることを達成するために長い道のりを歩んでいたのか疑問に思いました.