Pregunta

Tengo una muestra de código que obtiene un SEL del objeto actual,

SEL callback = @selector(mymethod:parameter2);

Y tengo un método como

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

Ahora necesito mover mymethod a otro objeto, digamos myDelegate .

He intentado:

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

pero no se compilará.

¿Fue útil?

Solución

SEL es un tipo que representa un selector en Objective-C. La palabra clave @selector () devuelve un SEL que usted describe. No es un puntero de función y no puede pasarle ningún objeto o referencia de ningún tipo. Para cada variable en el selector (método), debe representar eso en la llamada a @selector. Por ejemplo:

-(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
Los selectores

generalmente se pasan a los métodos delegados y a las devoluciones de llamada para especificar qué método debe llamarse en un objeto específico durante una devolución de llamada. Por ejemplo, cuando crea un temporizador, el método de devolución de llamada se define específicamente como:

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

Entonces, cuando programe el temporizador, usaría @selector para especificar qué método en su objeto será realmente responsable de la devolución de llamada:

@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;
}

En este caso, está especificando que el objeto obj se envíe un mensaje con myTimerCallback cada 30 segundos.

Otros consejos

No puede pasar un parámetro en un @selector ().

Parece que estás intentando implementar una devolución de llamada. La mejor manera de hacerlo sería algo como esto:

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

Luego, en setCallbackObject: withSelector: method: puede llamar a su método de devolución de llamada.

-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector {
    [anObject performSelector:selector];
}

Más allá de lo que ya se ha dicho sobre los selectores, es posible que desee ver la clase NSInvocation.

  

Una NSInvocation es un mensaje de Objective-C convertido en estático, es decir, es una acción convertida en un objeto. Los objetos NSInvocation se utilizan para almacenar y reenviar mensajes entre objetos y entre aplicaciones, principalmente por objetos NSTimer y el sistema de objetos distribuidos.

     

Un objeto NSInvocation contiene todos los elementos de un mensaje de Objective-C: un objetivo, un selector, argumentos y el valor de retorno. Cada uno de estos elementos se puede establecer directamente, y el valor de retorno se establece automáticamente cuando se despacha el objeto NSInvocation.

Tenga en cuenta que si bien es útil en ciertas situaciones, no utiliza NSInvocation en un día normal de codificación. Si solo está tratando de lograr que dos objetos se comuniquen entre sí, considere definir un protocolo de delegado informal o formal, o pasar un selector y un objeto de destino como ya se mencionó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top