Включить и отключить NSLog в режиме отладки - PullRequest
54 голосов
/ 01 июля 2011

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

#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, ...)

Как мне решить эту проблему для работы в режиме препроцессора?

- Правка -

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

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

Ответы [ 5 ]

104 голосов
/ 01 июля 2011

Это должно сработать:

 #ifdef DEBUG
 #   define NSLog(...) NSLog(__VA_ARGS__)
 #else 
 #   define NSLog(...) (void)0
 #endif
19 голосов
/ 12 января 2012

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

8 голосов
/ 13 июня 2014

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

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

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

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

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

1 голос
/ 24 декабря 2016

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

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

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

NSLog(@"????");

с

EXTRANSLog(@"????");

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

Я использую это при устранении неполадок и не хочу, чтобы отображались все лишние журналы. Только когда SomeFancyKey == ДА.

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

#define NSLog if(1) NSLog

, где 1 - ДА, показывает NSLog, а 0 - НЕТ.

1 голос
/ 10 апреля 2015
#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 для его отключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...