Comment passer @selector en paramètre?

Pour la méthode:

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

Comment passer dans un @selector? J’ai essayé de le convertir en (id) pour le faire comstackr, mais il tombe en panne lors de l’exécution.


Plus précisément, j’ai une méthode comme celle-ci:

 +(void)method1:(SEL)selector{ [NSThread detachNewThreadSelector:@selector(method2:) toTarget:self withObject:selector]; } 

Il plante. Comment passer le sélecteur sans planter, de sorte que le nouveau thread puisse appeler le sélecteur lorsque le thread est prêt?

Le problème ici n’est pas de passer un sélecteur à une méthode en soi, mais de passer un sélecteur où un object est attendu. Pour transmettre une valeur autre qu’un object en tant qu’object, vous pouvez utiliser NSValue . Dans ce cas, vous devez créer une méthode qui accepte un 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 

Vous pouvez convertir entre des sélecteurs et des objects de chaîne à l’aide des fonctions NSSsortingngFromSelector() et NSSelectorFromSsortingng() . Vous pouvez donc simplement passer des objects de chaîne à la place.

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

Utilisez NSValue, comme ça:

 +(void)method1:(SEL)selector { NSValue *selectorValue = [NSValue value:&selector withObjCType:@encode(SEL)]; [NSThread detachNewThreadSelector:@selector(method2:) toTarget:self withObject:selectorValue]; } 

NSValue est conçu comme un object-wrapper pour les types non-object arbitraires.

S’il vous plaît voir: passer une méthode en argument

Si vous ne voulez pas spécifier un object, utilisez simplement nil.

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

Si vous devez passer un object au sélecteur, cela ressemblera à ceci.

Ici je passe une chaîne à la méthode “setText”.

 NSSsortingng *ssortingng = @"hello world!"; [NSThread detachNewThreadSelector:@selector(setText:) toTarget:self withObject:ssortingng]; -(void)setText:(NSSsortingng *)ssortingng { [UITextField setText:ssortingng]; }