Включение и отключение NSLog в режиме отладки


Я хочу включить NSLog, когда я нахожусь в debug, и отключить его в противном случае. Очень простая вещь:

#ifdef DEBUG
NSLog(@"My log");
#endif
Но все это #ifdef и #endif - Борринг... : (Поэтому я попробую другую вещь: (.pch-хорошее место, чтобы положить его)
#ifdef DEBUG
#   define NSLog(text) NSLog(text);
#else 
#   define NSLog(text) 
#endif

Эта работа очень хороша (не рекурсивна). Но проблема в том, что у NSLog есть бесконечные аргументы.

void NSLog(NSString *format, ...)

Как я решаю эту задачу, чтобы работать в режиме препроцессора?

-- Edit --

Этот код делает ваш NSLog лучше:

#ifdef DEBUG
    #define NSLog(FORMAT, ...) fprintf(stderr,"%sn", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
    #define NSLog(...)
#endif
5 52

5 ответов:

Это должно сделать трюк:

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

Это немного короче и также отключает NSLog при использовании устройства. Если вы пишете игру, часто отправляемые NSLogs могут уменьшить ваш FPS с 60 до 20.

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

Все приведенные выше ответы верны. Я могу предложить вам сделать это также следующим образом. Предположим, у меня есть оператор if без скобок

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

Что произойдет, если он заменит NSLog без оператора. Поэтому мы можем просто заменить его пустым циклом.

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

Этот оператор будет выполнять пустой цикл один раз. Это безопасно удалит ваш NSLog из всего вашего живого кода.

#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

Установите значение Debug равным 1 для включения журнала и 0 для его отключения.

Вот хороший трюк... добавьте к любому .m

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

Заменить любой

NSLog(@"????");

С

EXTRANSLog(@"????");

В этом примере я создал ключ NSUser и установил BOOL в YES,, использовать какую-то форму переключателя и т.д., Чтобы изменить ключ на NO или удалить вообще, если вы не хотите просматривать EXTRANSLog через консольный отладчик.

Я использую это при устранении неполадок и не хочу, чтобы появлялись все избыточные журналы. Только когда какой-нибудь Фэнсикей = = да.

Это то же самое, что

#define NSLog if(1) NSLog

Где 1-Да, показать NSLog, а 0-Нет.