Włączanie i wyłączanie NSLog w trybie debugowania

Chcę włączyć NSLog, gdy jestem w debugowaniu i wyłączyć go w przeciwnym razie. Bardzo prosta sprawa:

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

Ale to wszystko #ifdef i #endif jest nudne... : (Więc staram się coś innego: (.pch is good place to put it)

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

To działa bardzo dobrze (nie jest rekurencyjne). Problem w tym, że NSLog ma nieskończone argumenty.

void NSLog(NSString *format, ...)

Jak to rozwiązać, aby działać w trybie preprocesora?

-- Edit --

Ten kod poprawi twój NSLog:

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

5 answers

To powinno załatwić sprawę:

 #ifdef DEBUG
 #   define NSLog(...) NSLog(__VA_ARGS__)
 #else 
 #   define NSLog(...) (void)0
 #endif
 103
Author: JustSid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-21 06:25:40

Jest to nieco krótsze i wyłącza NSLog podczas korzystania z urządzenia. Jeśli piszesz grę, często wysyłane Nslogi mogą zmniejszyć liczbę FPS z 60 do 20.

#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR)
    #define NSLog(...)
#endif
 19
Author: Aram Kocharyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-12 14:17:22

Wszystkie powyższe odpowiedzi są poprawne. Mogę zasugerować, aby zrobić to w następujący sposób również. Załóżmy, że mam polecenie if bez nawiasów

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

Co się stanie, jeśli zastąpi nslog bez instrukcji. Możemy więc po prostu zastąpić ją pustą pętlą.

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

Ta instrukcja uruchomi pustą pętlę raz. Spowoduje to bezpieczne usunięcie twojego NSLog z całego kodu NA ŻYWO.

 8
Author: NaXir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-28 11:28:48
#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

Ustaw Debug na 1, aby włączyć dziennik i 0, aby go wyłączyć.

 1
Author: Prashant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-10 07:05:34

Oto niezła sztuczka... Dodaj do dowolnego .m

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

Zastąp dowolny

NSLog(@"????");

Z

EXTRANSLog(@"????");

W tym przykładzie, utworzyłem klucz NSUser i ustawiłem BOOL na YES, użyj jakiejś formy switch itp, aby zmienić klucz NA NO lub usunąć całkowicie, jeśli nie chcesz przeglądać EXTRANSLog za pomocą debuggera konsoli.

Używam tego podczas rozwiązywania problemów i nie chcę, aby pojawiły się wszystkie nadmierne dzienniki. Tylko wtedy, gdy SomeFancyKey = = YES.

To jest to samo co

#define NSLog if(1) NSLog

Gdzie 1 to tak show nslog, a 0 to nie.

 1
Author: Canea Rowan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-24 06:32:38