web-dev-qa-db-fra.com

Activer et désactiver NSLog en mode DEBUG

Je veux activer NSLog lorsque je suis en débogage et le désactiver autrement. Une chose très simple est:

#ifdef DEBUG
NSLog(@"My log");
#endif

Mais tout cela #ifdef et #endif emprunte ... :( Donc j'essaye autre chose: (.pch est un bon endroit pour le mettre)

#ifdef DEBUG
#   define NSLog(text) NSLog(text);
#else 
#   define NSLog(text) 
#endif

Cela fonctionne très bien (n'est pas récursif). Mais le problème est que NSLog a des arguments infinis.

void NSLog(NSString *format, ...)

Comment résoudre ce problème pour travailler en mode préprocesseur?

-- Éditer --

Ce code améliore votre NSLog:

#ifdef DEBUG
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
    #define NSLog(...)
#endif
54
Rodrigo

Cela devrait faire l'affaire:

 #ifdef DEBUG
 #   define NSLog(...) NSLog(__VA_ARGS__)
 #else 
 #   define NSLog(...) (void)0
 #endif
104
JustSid

Ceci est un peu plus court et désactive également NSLog lors de l'utilisation d'un appareil. Si vous écrivez un jeu, les NSLogs envoyés souvent peuvent réduire votre FPS de 60 à 20.

#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR)
    #define NSLog(...)
#endif
19
Aram Kocharyan

Toutes les réponses ci-dessus sont correctes. Je peux également vous suggérer de le faire de la manière suivante. Supposons que j'ai une instruction if sans crochets

if(x==5)
NSLog("x is 5");

Que se passera-t-il s'il remplacera NSLog sans déclaration. Nous pouvons donc simplement le remplacer par une boucle vide.

#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...) do {} while (0)
#endif

Cette instruction exécutera une boucle vide une fois. Cela supprimera en toute sécurité votre NSLog de tout votre code en direct.

8
NaXir
#ifndef Debug
    #define Debug 1
#endif

#if Debug
#   define DebugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define DebugLog(...)
#endif

Définissez Debug sur 1 pour activer le journal et 0 pour le désactiver.

1
Prashant

Voici une belle astuce ... ajouter à n'importe quel .m

#define EXTRANSLog if([[NSUserDefaults standardUserDefaults] boolForKey:@"SomeFancyKey"] == YES) NSLog 

Remplacer tout

NSLog(@"????");

avec

EXTRANSLog(@"????");

Dans cet exemple, j'ai créé une clé NSUser et défini le BOOL sur YES, utilisez une forme de commutateur, etc. pour changer la clé sur NO ou la supprimer complètement si vous ne souhaitez pas afficher les EXTRANSLog via le débogueur de console.

Je l'utilise lors du dépannage et je ne veux pas que tous les journaux excessifs apparaissent. Uniquement lorsque SomeFancyKey == OUI.

C'est la même chose que

#define NSLog if(1) NSLog

où 1 est OUI affiche NSLog et 0 est NON.

1
Canea Rowan