2011-12-19 13 views
10

Este es mi código:Cast a BOOL a id en Objective-C

[delegate performSelectorOnMainThread:@selector(setVariablePremierAffichage:) withObject:TRUE waitUntilDone:NO]; 

El problema es que el argumento "withObject" Sólo se necesita un tipo de "id", así que, ¿cómo puedo emitir mi valor " VERDADERO "a un tipo de identificación? También uso administración de memoria ARC en Xcode para iOS 5.

+0

La respuesta que ha recibido es correcto. Pero, en lugar de saltar a través de aros para forzar a que algo así funcione, primero debería preguntarse por qué está utilizando 'performoSelectorOnMainThread' en primer lugar. ¿Por qué no simplemente usar '[delegate setVariablePremierAffichage: YES]' directamente? – Abizern

+1

@Abizem, tiene razón dependiendo del contexto. El OP puede llamar esto desde otro hilo. Incluso en ese caso, usar 'dispatch_async' en lugar de' performSelectorOnMainThread: 'permitiría llamar al método w/o usando NSNumber. Sin embargo, yo no llamaría a esto "saltar por los aros". Es una elección de implementación razonable, nuevamente, dependiendo del contexto. – XJones

Respuesta

20

Pase un NSNumber. Use boolNumber = [NSNumber numberWithBool:TRUE]. Su método debe definirse como:

-(void)setVariablePremierAffichage:(NSNumber *)boolNumber 
{ 
    BOOL value = [boolNumber boolValue]; 
    // do something 
} 
+2

Creo que quisiste decir '[NSNumber numberWithBool: YES]' como la convención Objective-C para BOOLs es 'YES' y' NO' en lugar de 'TRUE' y' FALSE' – Abizern

+0

TRUE/FALSE también. – XJones

+2

Sí, funciona, pero hay convenciones y SÍ/NO es el de Objective-C. – Abizern

0

No hay forma de convertir una primitiva en una identificación. Si necesita llamar a un método de forma dinámica como con performSelector tendrá que utilizar NSInvocation:

NSMethodSignature *sig = [self methodSignatureForSelector:@selector(setVariablePremierAffichage:)]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; 
BOOL yes = YES; 
[invocation setArgument:&yes atIndex:2]; 
[invocation setTarget:self]; 
[invocation setSelector:@selector(setVariablePremierAffichage:)]; 
[invocation invoke]; 

Salud!

4

Uso CFbooleanreference y echarlo

[delegate performSelectorOnMainThread:@selector(setVariablePremierAffichage:) withObject:(id)kCFBooleanTrue waitUntilDone:NO]; 
+0

¡Gracias por compartir! – smileBot