60

SEL現在のオブジェクトからを取得するコードサンプルがあります。

SEL callback = @selector(mymethod:parameter2);

そして、私は次のような方法を持っています

 -(void)mymethod:(id)v1 parameter2;(NSString*)v2 {
}

mymethod次に、別のオブジェクトに移動する必要がありますmyDelegate

私が試してみました:

SEL callback = @selector(myDelegate, mymethod:parameter2);

しかし、それはコンパイルされません。

4

3 に答える 3

102

SELは、Objective-Cのセレクターを表すタイプです。@selector()キーワードは、記述したSELを返します。これは関数ポインタではなく、オブジェクトや参照を渡すことはできません。セレクター(メソッド)の変数ごとに、@selectorの呼び出しでそれを表す必要があります。例えば:

-(void)methodWithNoParameters;
SEL noParameterSelector = @selector(methodWithNoParameters);

-(void)methodWithOneParameter:(id)parameter;
SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here

-(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo;
SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted

セレクターは通常、デリゲートメソッドとコールバックに渡され、コールバック中に特定のオブジェクトで呼び出されるメソッドを指定します。たとえば、タイマーを作成する場合、コールバックメソッドは具体的に次のように定義されます。

-(void)someMethod:(NSTimer*)timer;

したがって、タイマーをスケジュールするときは、@ selectorを使用して、オブジェクトのどのメソッドが実際にコールバックを担当するかを指定します。

@implementation MyObject

-(void)myTimerCallback:(NSTimer*)timer
{
    // do some computations
    if( timerShouldEnd ) {
      [timer invalidate];
    }
}

@end

// ...

int main(int argc, const char **argv)
{
    // do setup stuff
    MyObject* obj = [[MyObject alloc] init];
    SEL mySelector = @selector(myTimerCallback:);
    [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES];
    // do some tear-down
    return 0;
}

この場合、オブジェクトobjが30秒ごとにmyTimerCallbackでメッセージを送信されるように指定しています。

于 2008-11-18T02:48:39.590 に答える
18

@selector()でパラメータを渡すことはできません。

コールバックを実装しようとしているようです。そのための最良の方法は、次のようなものです。

[object setCallbackObject:self withSelector:@selector(myMethod:)];

次に、オブジェクトのsetCallbackObject:withSelector:メソッドで:コールバックメソッドを呼び出すことができます。

-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector {
    [anObject performSelector:selector];
}
于 2008-11-18T02:34:44.220 に答える
5

セレクターについて既に述べたことを超えて、NSInvocation クラスを見たいと思うかもしれません。

NSInvocation は、静的にレンダリングされた Objective-C メッセージです。つまり、オブジェクトに変換されたアクションです。NSInvocation オブジェクトは、主に NSTimer オブジェクトと分散オブジェクト システムによって、オブジェクト間およびアプリケーション間でメッセージを保存および転送するために使用されます。

NSInvocation オブジェクトには、Objective-C メッセージのすべての要素 (ターゲット、セレクター、引数、および戻り値) が含まれています。これらの各要素は直接設定でき、戻り値は NSInvocation オブジェクトがディスパッチされるときに自動的に設定されます。

特定の状況では便利ですが、通常のコーディングでは NSInvocation を使用しないことに注意してください。2 つのオブジェクトを相互に通信させようとしているだけの場合は、非公式または正式なデリゲート プロトコルを定義するか、既に述べたようにセレクターとターゲット オブジェクトを渡すことを検討してください。

于 2008-11-18T04:11:22.653 に答える