Включение и отключение 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 ответов:
Это должно сделать трюк:
#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-Нет.