2010-06-29 25 views
25

Escribo una aplicación para iPhone en base al SDK de Base 4.0, pero mi objetivo es OS 3.1.3 para que los usuarios de OS 3 puedan usar la aplicación.Deshabilitar una advertencia específica en una línea específica en Xcode

Me llaman:

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 

la que está en desuso en iOS 4.0. Soy consciente de esto y tengo medidas para llamar a la versión más reciente "con Animación" si nos estamos ejecutando con iOS 4.0 o superior.

Sin embargo, recibo una advertencia de que estoy llamando a un SDK en desuso.

Quiero deshabilitar esta advertencia específica en este lugar específico. Quiero todas las demás advertencias (incluida la misma advertencia obsoleta en otras ubicaciones)

¿Se puede lograr esto en Xcode?

Respuesta

71

Para CLANG, esto funciona:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    // Here I like to leave a comment to my future self to explain why I need this deprecated call 
    NSString *myUDID = [[UIDevice currentDevice] uniqueIdentifier]; 
#pragma clang diagnostic pop 

Usted puede utilizarlo dentro de un método, lo que le permite ser muy específico sobre la línea que hace que la advertencia de que deseas han ignorado.

+0

esto funcionó muy bien, gracias – elsurudo

+7

Esto realmente debería marcarse como la respuesta correcta. Es menos hacky y resuelve el problema en tiempo de compilación, además de ser un poco más limpio. –

+0

+1 para el uso correcto de clang, esta debería ser la respuesta, NSInvocación es un truco –

19

Es posible que pueda utilizar pragmas GCC. Esto debería desactivar la advertencia obsoleta para la función incluida.

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated" 
-(void)foo{ 
    // As Georg Fritzsche notes below, the pragmas only work outside of functions 
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES]; 
} 
#pragma GCC diagnostic pop 

No sé si esto va a funcionar con Clang, pero debe trabajo con GCC.

Básicamente, guarda el estado de las advertencias/errores, deshabilita la advertencia obsoleta, compila la función y luego restaura el estado de los diagnósticos.

+1

Esos pragmas no están permitidos dentro de las funciones, tendrían que rodear alguna función de ayuda. –

+0

Gracias. Esto en realidad no funcionó. Parece que las palabras clave 'push' y 'pop' no son válidas, ya que generaron sus propias advertencias. –

+0

Sin efecto aquí. – Jonny

8

Puede utilizar NSInvocation de moverse por las advertencias independientes del compilador utilizado:

UIApplication *app = [UIApplication sharedApplication]; 
SEL sel = @selector(setStatusBarHidden:animated:); 
NSMethodSignature *sig = [app methodSignatureForSelector:sel]; 
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig]; 
BOOL b = YES; 
[inv setTarget:app]; 
[inv setSelector:sel]; 
[inv setArgument:&b atIndex:2]; 
[inv setArgument:&b atIndex:3]; 
[inv invoke]; 

o de una manera menos tolerante a errores:

UIApplication *app = [UIApplication sharedApplication]; 
SEL sel = @selector(setStatusBarHidden:animated:); 
IMP imp = [app methodForSelector:sel]; 
imp(app, sel, YES, YES); 
+1

¿Podría el '[NSMethodSignature signatureWithObjCTypes:" v @ cc "]' ser reemplazado con '[[UIApplication sharedApplication] methodSignatureForSelector: @selector (setStatusBarHidden)]' para que sea más fácil de leer? –

+0

Derecha, por supuesto. –

+0

Funciona como un regalo. Gracias. –

4

que se pueden realizar como este para superar las advertencias a la vez

#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
(void) methodUsingDeprecatedStuff { //use deprecated stuff } 

o

Sólo tienes que pegar esta línea antes de usar su animal obsoletas cada vez para evitar advertencias

#pragma GCC aviso de diagnóstico "-Wdeprecated-declaraciones"

esto eliminará las advertencias.

Espero que te ayude.

Cuestiones relacionadas