Suprimir advertencias obsoletas en Xcode

133

Con todos los SDK flotando, es útil poder construir para múltiples SDK y plataformas. Sin embargo, rebotando de 3.2 a 3.0 e incluso ocasionalmente 2.x, frecuentemente recibo advertencias obsoletas que involucran métodos que han cambiado o han sido reemplazados:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

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

Ben Gottlieb
fuente
44
Si bien la respuesta de Paul R funciona, considere que manicaesar es un poco más quirúrgico, ya que le permite suprimir exactamente la advertencia que desea, 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

Respuestas:

82

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).

Versiones actuales de Xcode (por ejemplo, Xcode 9.2):

ingrese la descripción de la imagen aquí


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

ingrese la descripción de la imagen aquí

Paul R
fuente
17
Resulta que es aún más fácil que eso; hay una casilla de verificación en la configuración de destino de Xcode; Su respuesta me llevó a buscar allí. ¡Gracias!
Ben Gottlieb
44
También puede hacer esto por archivo. Consulte esta respuesta para agregar indicadores por archivo: stackoverflow.com/a/6658549/272473
mrwalker el
44
respuestas como esta son frustrantes para los novatos. Pruébalo donde? ¿Cómo encuentro la configuración de destino? Un poco más de explicación aumentaría el valor de esta respuesta.
noogrub
8
Una respuesta que esta mal explicada no debe marcarse como correcta.
Chris Hatton
66
Busque "Desaprobado" en la configuración de compilación y lo verá.
quantumpotato
337

Como todavía no puedo agregar un comentario a la publicación @samiq, creo que lo expandiré. Ingrese la directiva mencionada antes de una función / método en el que usa cosas obsoletas. Luego puede restaurar la configuración anterior después de la definición del final de la función:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma GCC diagnostic pop
manicaesar
fuente
1
¡Excelente! Esto es lo que estaba buscando +1 :)
Zoran Simic
1
Consejo impresionante! Lástima que no se pueda declarar dentro de un método.
Dustin
12
En realidad se puede declarar dentro de un método. Solo tenía que hacerlo hoy debido a un error en los documentos / sdk
jer
66
+1 Una forma un poco mejor es utilizar la sintaxis #pragma GCC diagnostics push #pragma GCC diagnostics ignored "-Wdeprecated-declarations" .. .. Code here .. .. #pragma GCC diagnostic pop ya que este método lo lleva de vuelta a la configuración establecida antes ... [ gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]
Niclas
3
Cambiado según las sugerencias :)
manicaesar
143

Clang proporciona una buena característica que hace que el paso "restaurar" en la publicación @manicaesar sea independiente del estado de advertencia inicial:

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

Para citar el manual de Clang :

Además de toda la funcionalidad proporcionada por el pragma de GCC, Clang también le permite presionar y reventar el estado de advertencia actual. Esto es particularmente útil al escribir un archivo de encabezado que será compilado por otras personas, porque no sabe con qué banderas de advertencia se compilan.

Andrew Hershberger
fuente
1
Las versiones más recientes de GCC usan la misma sintaxis (clang sustituto de GCC).
Niclas
3
Siempre me confundo acerca de qué es LLVM, GCC y Clang. Entonces, quería dejar una nota para ahorrar tiempo. GNU Complier Collection (GCC) se usó con Xcode 3, luego Apple lanzó Xcode 4 con un híbrido LLVM-GCC. Luego de bajo nivel de máquina virtual (LLVM) compilador se hizo cargo, consulte más información en 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".
serge-k
42

Como tendemos a necesitar soporte para sistemas operativos más antiguos, pero prestamos atención a nuestras advertencias, quería una forma más ordenada de hacerlo. Puse esto junto, inspirado en un 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 funciona con bloques de código:

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

Además, cuando abandona el soporte para dispositivos anteriores a iOS 7, puede buscar fácilmente a través del código para encontrar los usos desaprobados para corregir.

Joe Hughes
fuente
Esta es una solución a largo plazo mucho mejor para la mayoría de los códigos que reducir las advertencias de desaprobación (o cualquier otra) a nivel global / de proyecto. Excelente respuesta.
natbro
1
¿Por qué es do { ... } while(0);requerido?
Ben Leggiero
1
@ BenC.R.Leggiero porque no estás pasando un bloque sino varias declaraciones entre esos paréntesis. Básicamente estás suprimiendo advertencias para cada línea.
Alejandro Iván
1
@ AlejandroIván Sé que tu explicación tiene sentido para ti ... pero para mí, parece que estás reformulando la pregunta. ¿Puede explicar por qué do{...}while(0);se requiere aquí en particular? ¿Por qué no solo {...}? ¿Por qué no if(true){...}? etc.
Ben Leggiero
2
@ BenC.R.Leggiero tienes razón. Por alguna razón, leí mal tu pregunta. Verifique la respuesta aceptada aquí: stackoverflow.com/questions/154136/…
Alejandro Iván
29

También puede suprimir advertencias por archivo utilizando

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

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

samiq
fuente
20

Si desea silenciar la advertencia Implementando método obsoleto o Implementando clase obsoleta , use:

    #pragma clang diagnóstico push
    #pragma clang diagnostica ignorado "-Wdeprecated-implementations"
    // código
    #pragma clang diagnosis pop

krzysztof
fuente
Cuando vi "-Wdeprecated-declaraciones", supongo que debe haber "-Wdeprecated-implementations". Y realmente funciona. Gracias.
DawnSong
8

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

ingrese la descripción de la imagen aquí

Hola Mundo
fuente
Cerrará todas las advertencias "obsoletas", sin embargo, solo algunas advertencias deben suprimirse.
DawnSong
2

Si desea una comprobación general de todo tipo de desaprobaciones en un código. Utilice la bandera -Wdeprecated como a continuación:

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

Para deshabilitar la advertencia del archivo de encabezado de terceros, agregue la siguiente línea en la parte superior del archivo

#pragma clang system_header
harvestli
fuente