51 votes

Comment passer @selector en paramètre?

Pour la méthode :

Comment passer dans un @selector ? J’ai essayé Castant (ID) pour le rendre à compiler, mais il se bloque au moment de l’exécution.


Plus précisément, j’ai une méthode comme ceci :

Il se bloque. Comment passer dans le sélecteur sans s’écraser, afin que le nouveau thread peut appeler le sélecteur lorsque le thread est prêt ?

67voto

Chuck Points 138930

Le problème ici n'est pas de passer un sélecteur à une méthode, mais de passer à un sélecteur lorsqu'un objet est attendu. Pour transmettre une valeur non-objet en tant qu'objet, vous pouvez utiliser NSValue . Dans ce cas, vous devrez créer une méthode qui accepte une NSValue et récupère le sélecteur approprié. Voici un exemple d'implémentation:

 @implementation Thing
- (void)method:(SEL)selector {
    // Do something
}

- (void)methodWithSelectorValue:(NSValue *)value {
    SEL selector;

    // Guard against buffer overflow
    if (strcmp([value objCType], @encode(SEL)) == 0) {
        [value getValue:&selector];
        [self method:selector];
    }
}

- (void)otherMethodShownInYourExample {
    SEL selector = @selector(something);
    NSValue *selectorAsValue = [NSValue valueWithBytes:&selector objCType:@encode(SEL)];
    [NSThread detachNewThreadSelector:@selector(methodWithSelectorValue:) toTarget:self withObject:selectorAsValue];
}
@end
 

42voto

user102008 Points 8748

Vous pouvez convertir entre les sélecteurs et les objets chaîne à l'aide des fonctions NSStringFromSelector() et NSSelectorFromString() . Vous pouvez donc simplement passer des objets chaîne à la place.

Sinon, si vous ne souhaitez pas modifier vos méthodes, vous pouvez créer un NSInvocation pour créer une invocation pour votre appel de méthode (car elle peut configurer des invocations avec des arguments non-objet), puis appeler il fait [NSThread detachNewThreadSelector:@selector(invoke) toTarget:myInvocation withObject:nil];

4voto

BJ Homer Points 29168

Utiliser NSValue, comme suit :

NSValue est conçu comme un wrapper d’objet pour les types non objet arbitraires.

2voto

ennuikiller Points 28005

0voto

Brandon Points 3819

Si vous ne voulez pas spécifier d'objet, utilisez nil.

 [NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:nil];
 

Si vous devez transmettre un objet au sélecteur, cela ressemble à quelque chose comme ceci.

Ici, je passe une chaîne à la méthode "setText".

 NSString *string = @"hello world!";
 [NSThread detachNewThreadSelector:@selector(setText:) toTarget:self withObject:string];


-(void)setText:(NSString *)string {
    [UITextField setText:string]; 
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X