objective-c cocoa nslog

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.