2010-06-29 4 views
25

J'écris une application iPhone avec le SDK Base 4.0, mais je cible OS 3.1.3 pour que les utilisateurs d'OS 3 puissent utiliser l'application.Désactivation d'un avertissement spécifique sur une ligne spécifique dans Xcode

J'appelle:

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

qui est délaissé dans iOS 4.0. Je suis conscient de cela, et j'ai des mesures en place pour appeler la version la plus récente "withAnimation" si nous sommes sous iOS 4.0 ou supérieur. Cependant, j'obtiens un avertissement que j'appelle un SDK obsolète.

Je souhaite désactiver cet avertissement spécifique à cet endroit spécifique. Je veux tous les autres avertissements (y compris le même avertissement désapprouvé dans d'autres endroits)

Est-ce que cela peut être accompli dans Xcode?

Répondre

71

Pour CLANG, cela fonctionne:

#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 

Vous pouvez l'utiliser dans une méthode qui vous permet d'être très précis sur la ligne qui provoque l'avertissement que vous voulez avoir ignoré.

+0

cela a fonctionné très bien, merci – elsurudo

+7

Cela devrait vraiment être marqué comme la bonne réponse. C'est moins hacky et résout le problème au moment de la compilation, en plus d'être un peu plus propre. –

+0

+1 pour une utilisation correcte de clang, cela devrait être la réponse, NSInvocation est un hack –

19

Vous pourriez utiliser les pragmas GCC. Cela devrait désactiver l'avertissement déconseillé pour la fonction ci-jointe.

#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 

Je ne sais pas si cela va fonctionner avec Clang, mais il devrait travailler avec GCC.

Fondamentalement, il sauvegarde l'état des avertissements/erreurs, désactive l'avertissement déconseillé, compile la fonction, puis restaure l'état des diagnostics.

+1

Ces pragmas ne sont pas autorisés à l'intérieur des fonctions, ils devraient entourer une fonction d'assistance. –

+0

Merci. Cela n'a pas fonctionné réellement. Il semble que les mots-clés 'push' et 'pop' ne soient pas valides, car ils ont généré leurs propres avertissements. –

+0

Aucun effet ici. – Jonny

8

Vous pouvez utiliser NSInvocation pour contourner les avertissements indépendants du compilateur utilisé:

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]; 

Ou dans une manière moins tolérante aux erreurs:

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

Est-ce que le '[NSMethodSignature signatureWithObjCTypes:" v @ cc "]' peut être remplacé par '[[UIApplication sharedApplication] methodSignatureForSelector: @selector (setStatusBarHidden)]' pour le rendre plus facile à lire? –

+0

Bien sûr, bien sûr. –

+0

Fonctionne un régal. Merci. –

4

vous pouvez l'exécuter comme celui-ci à surmonter les mises en garde à la fois

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

ou

Il suffit de coller cette ligne avant d'utiliser vos animaux dépréciés à chaque fois pour éviter les avertissements

#pragma avertissement diagnostic GCC « -Wdeprecated-déclarations »

cela supprimera les avertissements.

J'espère que cela vous aidera.

Questions connexes