2010-04-12 20 views
117

Con todos los SDK flotando, es útil poder compilar para varios SDK y plataformas. Sin embargo, rebotando de 3.2 a 3.0 y en ocasiones incluso 2.x, Frecuentemente recibo advertencias obsoletas implican métodos que han cambiado o sido sustituidos:Suprimir advertencias obsoletas en Xcode

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated. 

Dado que todavía quiero mantener la compatibilidad con los sistemas operativos más antiguos, y estoy también tratando de eliminar el "ruido" al construir, ¿hay alguna forma de desactivar o desactivar estas advertencias?

+3

Si bien la respuesta de Pablo R funciona, considere que manicaesar es un poco más quirúrgica, ya que permite suprimir exactamente el aviso que desee, sin perder otras advertencias adicionales que podrían ser importantes. Me parece que, en términos de mejores prácticas, manicaesar tiene The Correct Answer ™ – Olie

Respuesta

67

Pruebe -Wno-deprecated-declarations, o su configuración correspondiente en Xcode, GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS (consejo profesional: simplemente escriba "obsoleto" en la configuración de compilación para encontrar la configuración específica para esta advertencia).

Las versiones actuales de Xcode (por ejemplo Xcode 9.2): Las versiones

enter image description here


antiguas de Xcode (por ejemplo Xcode 2.x, 3.x):

enter image description here

+17

Resulta que es incluso más fácil que eso; hay una casilla de verificación en la configuración de destino de Xcode; su respuesta me impulsó a buscar allí. ¡Gracias! –

+2

También puede hacerlo por archivo. Consulte esta respuesta para agregar indicadores por archivo: http://stackoverflow.com/a/6658549/272473 – mrwalker

+4

respuestas como esta son frustrantes para newbs. Pruébalo donde? ¿Cómo encuentro la configuración del objetivo? Un poco más de explicación aumentaría el valor de esta respuesta. – noogrub

25

También puede suprimir las advertencias por archivo usando

#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 

que a su vez hace que sea un poco mejor práctica que simplemente suprimir todas las advertencias una vez y juntas ... después de todo tienes que saber para qué lo estás haciendo.

+0

Upvoted ... funcionó como un encanto – NSPratik

300

Como todavía no puedo agregar un comentario a la publicación de @samiq, creo que lo ampliaré. Ingrese la directiva mencionada antes de una función/método en el que use elementos obsoletos. A continuación, puede restaurar la configuración anterior después de la definición de la función final:

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

¡Excelente! Esto es lo que estaba buscando +1 :) –

+1

Awesome tip! Lástima que no se puede declarar dentro de un método. – Dustin

+12

En realidad, se puede declarar dentro de un método. Sólo tenía que hacerlo hoy en día debido a un error en la docs/SDK – jer

131

Clang ofrece una buena característica que hace que la "restauración" paso en el puesto @manicaesar independiente del estado de alerta inicial:

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

para citar el estruendo manual:

Además de toda la funcionalidad proporcionada por Pragma de GCC, Clang también le permite empujar y hacer estallar la advertencia actual estado. Esto es particularmente útil cuando se escribe un archivo de encabezado que será compilado por otras personas, porque usted no sabe con qué banderas de advertencia se construyen.

+1

Las versiones más recientes de GCC usan la misma sintaxis (sustitúyase clang por GCC). – Niclas

+2

Siempre me confundo sobre lo que es LLVM, GCC y Clang. Entonces, quería dejar caer una nota para ahorrar tiempo. GNU Complier Collection (GCC) se utilizó con Xcode 3, luego Apple lanzó Xcode 4 con un híbrido LLVM-GCC. Entonces el compilador de la máquina virtual de bajo nivel (LLVM) se hizo cargo, vea más información en http://llvm.org. A partir de Xcode 7.2.1, el compilador predeterminado es Apple LLVM 7.0. El compilador LLVM es una biblioteca de otros "proyectos", depuradores y otras herramientas, que incluyen el compilador nativo Clang. Clang es un compilador C/C++/Objective-C "nativo de LLVM". –

-2

por desactivar la advertencia de archivo de cabecera de terceros, agregue siguiente línea en la parte superior del archivo de

#pragma clang system_header 
36

ya que tienden a tener que soportar los sistemas operativos más antiguos, pero preste atención a nuestras advertencias, quería una forma más ordenada de hacer esto.Pongo esto en conjunto, inspirado por algún código de Mozilla:

#define SILENCE_DEPRECATION(expr)         \ 
do {                \ 
_Pragma("clang diagnostic push")         \ 
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ 
expr;                \ 
_Pragma("clang diagnostic pop")          \ 
} while(0) 

#define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 
#define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 

Esto le permite hacer lo siguiente:

SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]); 

También trabaja con bloques de código:

SILENCE_IOS7_DEPRECATION(
    view = [[MKPolylineView alloc] initWithPolyline:self]; 
    view.lineWidth = self.lineWidth; 
    view.strokeColor = self.color; 
); 

Además, Cuando suelta la compatibilidad con dispositivos anteriores a iOS 7, puede buscar fácilmente a través del código para encontrar los usos desaprobados para solucionar.

+0

esta es una solución mucho mejor a largo plazo para la mayoría de los códigos que restringir la depreciación (o cualquier otra) advertencias a nivel global/de proyecto. excelente respuesta – natbro

+0

Esa es una forma muy sexy de resolver este problema común. Aprecio tu esfuerzo. –

+0

Solo como referencia, esto se puede usar para cualquier opción de clang ...Personalmente lo uso para esto ('-Wdeprecated-declarations') y para deshabilitar la advertencia de pérdidas de rendimiento deSelector (' -WperformSelector-leaks'). Solo necesita cambiar la opción en la segunda llamada '_Pragma' en consecuencia. –

5

En la configuración de compilación, busque Deprecated Functions.

enter image description here

Cuestiones relacionadas