Creación de un selector a partir de un nombre de método con parámetros


Tengo un ejemplo 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á.

Author: Josh Caswell, 2008-11-18

3 answers

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 representarla 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 se debe llamar a un objeto específico durante una devolución de llamada. Para instancia, cuando se crea un temporizador, el método de devolución de llamada se define específicamente como:

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

Así que cuando programes el temporizador usarás @selector para especificar qué método en tu 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 por mensaje con myTimerCallback cada 30 segundos.

 98
Author: Jason Coco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 03:11:45

No puedes 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 el método setCallbackObject:witselector: de su objeto: puede llamar a su método de devolución de llamada.

-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector {
    [anObject performSelector:selector];
}
 18
Author: Grant Limberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-29 15:53:07

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

Un NSInvocation es un mensaje Objective-C que se vuelve 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 los objetos NSTimer y el sistema de objetos distribuidos.

Un objeto NSInvocation contiene todos los elementos de un Objective-C mensaje: un destino, un selector, argumentos y el valor devuelto. Cada uno de estos elementos se puede establecer directamente, y el valor devuelto se establece automáticamente cuando se envía 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 obtener dos objetos para comunicarse entre sí, considere definir un protocolo de delegado informal o formal, o pasar un selector y un objeto de destino como ya se ha mencionado.

 5
Author: Marc Charbonneau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-18 04:11:22