Ответ 1
Это должно сделать трюк:
#ifdef DEBUG
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) (void)0
#endif
Я хочу включить NSLog, когда я в отладке, и отключить его в противном случае. Очень простая вещь:
#ifdef DEBUG
NSLog(@"My log");
#endif
Но все это #ifdef
и #endif
является borring...:( Так что я пробую другую вещь: (.pch - это хорошее место)
#ifdef DEBUG
# define NSLog(text) NSLog(text);
#else
# define NSLog(text)
#endif
Эта работа очень тонкая (не рекурсивна). Но проблема в том, что NSLog имеет бесконечные аргументы.
void NSLog(NSString *format, ...)
Как я решаю это для работы в режиме препроцессора?
- Изменить -
Этот код сделает ваш NSLog лучше:
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif
Это должно сделать трюк:
#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 через консольный отладчик.
Я использую это при устранении неполадок и не хочу, чтобы все избыточные журналы отображались. Только когда SomeFancyKey == ДА.
Это то же самое, что и
#define NSLog if(1) NSLog
где 1 - YES, показывает NSLog, а 0 - NO.