2011-07-01 14 views
51

Quiero habilitar NSLog cuando estoy en depuración y desactivarlo de lo contrario. Una cosa es muy simple:Habilitar y deshabilitar NSLog en el modo DEPURAR

#ifdef DEBUG 
NSLog(@"My log"); 
#endif 

Pero todo esto #ifdef#endif y es borring ... :(Así que intento otra cosa: (.pch es buen lugar para ponerlo)

#ifdef DEBUG 
# define NSLog(text) NSLog(text); 
#else 
# define NSLog(text) 
#endif 

Este trabajar muy bien (no es recursivo). Pero el problema es que NSLog tiene argumentos infinitos.

void NSLog(NSString *format, ...) 

Cómo resuelvo esto funcione en modo preprocesador?

- Editar -

Este código hacen su mejor NSLog:

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

+1 por buena pregunta. Un componente reutilizable completo sobre este tema en http://mobile.tutsplus.com/tutorials/iphone/customize-nslog-for-easier-debugging/ –

+0

. Sigo la guía en el enlace. Pero obtuve el siguiente error de compilación: ** Símbolos indefinidos para la arquitectura x86_64: ld: símbolos no encontrados para la arquitectura x86_64 clang: error: el comando del enlazador falló con el código de salida 1 (use -v para ver la invocación) ** Por favor, ayuda @MahbuburRAaman – Gon

+0

@Gon, Error ** Símbolos no definidos para la arquitectura x86_64: ld: símbolo (s) que no se encuentran para la arquitectura x86_64 ** aparece por varias razones. Por ejemplo, para la biblioteca faltante u otros casos, eche un vistazo al siguiente recurso SO http://stackoverflow.com/questions/18408531/xcode-build-failure-undefined-symbols-for-architecture-x86-64, http: //stackoverflow.com/questions/11996227/undefined-symbols-for-architecture-x86-64-in-objective-c, http://stackoverflow.com/questions/6231368/objective-c-undefined-symbol-compilation- error. –

Respuesta

100

Esto debe hacer el truco:

#ifdef DEBUG 
# define NSLog(...) NSLog(__VA_ARGS__) 
#else 
# define NSLog(...) (void)0 
#endif 
+0

Solo esto ... Putz ... ¡Gracias! – Rodrigo

+1

Está bien pero reemplaza # define NSLog (...) NSLog (__ VA_ARGS__); con # define NSLog (...) NSLog (__ VA_ARGS__) (eliminar el último;) –

+0

@JustSid: ¿Cómo configuro o restablezco el indicador DEBUG? –

19

Esto es un poco más corto y también se desactiva cuando se utiliza NSLog un dispositivo. Si estás escribiendo un juego, NSLogs enviados a menudo pueden reducir su FPS de 60 a 20.

#if !defined(DEBUG) || !(TARGET_IPHONE_SIMULATOR) 
    #define NSLog(...) 
#endif 
8

Todas las respuestas anteriores son correctas. Puedo sugerirte que lo hagas de la siguiente manera también. Supongamos que tengo una sentencia if sin soportes

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

lo que ocurrirá si se reemplazará NSLog con ninguna 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 forma segura su NSLog de todo su código en vivo.

+3

Buen punto, y ese también es un buen lugar para repetir que el uso de sentencias 'if' sin corchetes es probablemente una mala idea en primer lugar. –

+11

el código será preprocesado a 'if (x == 5);' que está bien. –

+0

Esto no funciona bien con el operador ternario. –

1
#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.

+0

¿Dónde puedo colocar este código, por favor? –

+0

Puede crear un archivo de encabezado constante y agregarle el código y para acceder solo necesita importar el archivo de encabezado y usar la función DebugLog para registrar las variables que desea ... – Prashant

1

Aquí es un buen truco ... añadir a cualquier .m

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

Reemplazar cualquier

NSLog(@"????"); 

con

EXTRANSLog(@"????"); 

En este ejemplo, he creado un NSUser clave y configure el BOOL en SÍ, use 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 == YES.

Esto es lo mismo que

#define NSLog if(1) NSLog 

donde 1 es SÍ espectáculo NSLog, y 0 es NO.

Cuestiones relacionadas