objective c - Habilitar e inhabilitar NSLog en modo DEBUG
objective-c cocoa (5)
Aquí hay un buen truco ... agregar a cualquier .m
#define EXTRANSLog if([[NSUserDefaults standardUserDefaults] boolForKey:@"SomeFancyKey"] == YES) NSLog
Reemplace cualquier
NSLog(@"????");
con
EXTRANSLog(@"????");
En este ejemplo, creé una clave NSUser y configuré BOOL en SÍ, uso alguna forma de interruptor, etc. para cambiar la clave a NO o eliminarla por completo si no desea ver el EXTRANSLog a través del depurador de la consola.
Lo uso cuando soluciono problemas y no quiero que aparezcan todos los registros excesivos. Solo cuando SomeFancyKey == SÍ.
Esto es lo mismo que
#define NSLog if(1) NSLog
donde 1 es SÍ muestra NSLog, y 0 es NO.
Quiero habilitar NSLog cuando estoy en depuración y desactivarlo de lo contrario. Una cosa muy simple es:
#ifdef DEBUG
NSLog(@"My log");
#endif
Pero todo este #ifdef
y #endif
es aburrido ... :( Así que intento otra cosa: (.pch es un buen lugar para ponerlo)
#ifdef DEBUG
# define NSLog(text) NSLog(text);
#else
# define NSLog(text)
#endif
Este trabajo es muy bueno (no es recursivo). Pero el problema es que NSLog tiene argumentos infinitos.
void NSLog(NSString *format, ...)
¿Cómo soluciono esto para que funcione en el modo de preprocesador?
- Editar -
Este código mejora su NSLog:
#ifdef DEBUG
#define NSLog(FORMAT, ...) fprintf(stderr,"%s/n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define NSLog(...)
#endif
Esto debería funcionar:
#ifdef DEBUG
# define NSLog(...) NSLog(__VA_ARGS__)
#else
# define NSLog(...) (void)0
#endif
Esto es un poco más corto y también deshabilita NSLog cuando se usa un dispositivo. Si está escribiendo un juego, NSLogs enviados a menudo puede reducir su FPS de 60 a 20.
#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR)
#define NSLog(...)
#endif
Todas las respuestas anteriores son correctas. Puedo sugerirte que lo hagas de la siguiente manera también. Supongamos que tengo una instrucción if sin corchetes
if(x==5)
NSLog("x is 5");
¿Qué pasará si reemplaza NSLog sin declaración? Entonces podemos simplemente reemplazarlo con un bucle vacío.
#ifdef DEBUG
#define NSLog(...) NSLog(__VA_ARGS__)
#else
#define NSLog(...) do {} while (0)
#endif
Esta instrucción ejecutará un bucle vacío una vez. Esto eliminará de manera segura su NSLog de todo su código en vivo.
#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
Establezca Debug en 1 para habilitar el registro y 0 para deshabilitarlo.