web-dev-qa-db-fra.com

Supprimer les avertissements déconseillés dans Xcode

Avec tous les SDK flottants, il est pratique de pouvoir créer plusieurs SDK et plates-formes. Cependant, en passant de 3.2 à 3.0 et même parfois à 2.x, je reçois fréquemment des avertissements obsolètes impliquant des méthodes modifiées ou remplacées:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

Étant donné que je souhaite toujours conserver la compatibilité avec les anciens systèmes d'exploitation et que je m'efforce également de supprimer le "bruit" lors de la construction, existe-t-il un moyen de désactiver ou de désactiver ces avertissements?

126
Ben Gottlieb

Essayez -Wno-deprecated-declarations, ou son paramètre correspondant dans Xcode, GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS (astuce: il suffit de taper "obsolète" dans les paramètres de construction pour trouver le paramètre spécifique de cet avertissement).

Versions actuelles de Xcode (par exemple, Xcode 9.2):

 enter image description here


Anciennes versions de Xcode (par exemple, Xcode 2.x, 3.x):

 enter image description here

74
Paul R

Comme je ne peux pas encore ajouter de commentaire au billet de @samiq, je pense que je vais le développer. Entrez la directive mentionnée avant une fonction/méthode dans laquelle vous utilisez des éléments obsolètes. Ensuite, vous pouvez restaurer le paramètre précédent après la définition de la fonction end:

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

Clang fournit une fonctionnalité Nice qui rend l'étape de "restauration" de la publication @manicaesar indépendante de l'état d'avertissement initial:

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

Pour citer le Clang manual :

En plus de toutes les fonctionnalités fournies par le pragma de GCC, Clang vous permet également de pousser et d'afficher l'état d'avertissement actuel. Ceci est particulièrement utile lors de l'écriture d'un fichier d'en-tête qui sera compilé par d'autres personnes, car vous ne savez pas avec quels indicateurs d'avertissement elles ont été construites.

139
Andrew Hershberger

Comme nous avons tendance à avoir besoin de prendre en charge les anciens systèmes d’exploitation, mais attention à nos avertissements, je voulais un moyen plus ordonné de procéder. J'ai mis cela ensemble, inspiré par du code 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)

Cela vous permet de faire ce qui suit:

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

Cela fonctionne aussi avec des blocs de code:

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

En outre, lorsque vous supprimez la prise en charge des appareils antérieurs à iOS 7, vous pouvez facilement rechercher dans le code pour rechercher les utilisations déconseillées à corriger.

39
Joe Hughes

Vous pouvez également supprimer les avertissements par fichier en utilisant 

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

ce qui en retour rend la pratique un peu meilleure que de simplement supprimer tous les avertissements une fois et ensemble ... après tout, vous devez savoir pourquoi vous le faites.

28
samiq

Si vous souhaitez désactiver l'avertissement Implémentation d'une méthode obsolète ou Implémentation d'une classe obsolète , utilisez


 #pragma clang diagnostic Push 
 #pragma clang diagnostic ignored "-Wdeprecated-implémentations" 
 // code 
 #pragma clang diagnostic pop 

13
krzysztof

Dans vos paramètres de construction, recherchez Deprecated Functions.

 enter image description here

7
SmallChess

Si vous souhaitez une vérification générale de toutes les déprécations dans un morceau de code. Veuillez utiliser le drapeau -Wdeprecated comme ci-dessous:

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