2010-08-15 5 views
21

¿Tiene NSLog() variantes que se imprimen sin las marcas de fecha y hora y la nueva línea automática?¿Es posible NSLog() sin las marcas de fecha y hora y la nueva línea automática?

Gracias. Ahora, con siguiente código, puedo imprimir NSString, cCadena, u objetos:

#import <Foundation/Foundation.h> 
#import <stdio.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSString *s = @"Hello, World!"; 
    NSDate *today = [NSDate date]; 

    NSLog(@"%@", s); 
    printf("%s at %s", [s UTF8String], [[today description] UTF8String]); 

    [pool drain]; 
    return 0; 
} 
+0

Use [** 'MLog.h en GitHub' **] (https://github.com/InderKumarRathore/MLog) –

Respuesta

19

Uso printf() en lugar de NSLog()

+0

¿Printf() es compatible con NSString? –

+4

@Stephen no, tendría que usar algo como 'printf ("% s% s \ n ", [someString UTF8String], [[someObject description] UTF8String]);' – cobbal

+0

No, es una función C. Entonces, tendrías que convertir NSString en una matriz de caracteres.Así 'printf ([myString cStringUsingEncoding: NSASCIIStringEncoding]);' – NebulaFox

14

Me molestaba demasiado, así que escribió una función para reemplazar NSLog() y printf():

void IFPrint (NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 

    fputs([[[[NSString alloc] initWithFormat:format arguments:args] autorelease] UTF8String], stdout); 

    va_end(args); 
} 

Luego, puede usarlo en lugar de NSLog() (p. Ej.,), pero no imprimirá marcas de tiempo ni una nueva línea, y no tendrá que perder el tiempo con C s trings y matrices, y otras cosas. Es bastante útil, diría yo.

Si lo desea, consulte mi código completo (también he escrito un reemplazo para fprintf, scanf y fscanf) here.
(También hay un tema SO sobre él here).

2

el primero que hago en cualquier proyecto es la caída de (mi versión condensada de) this class ... que se deshace de todas las tonterías en NSLog ... Ponga esto en la parte superior de un archivo .m - y la consola la salida será PERFECTO.

#import <Foundation/Foundation.h> 
#import <stdio.h> 
#define MLogString(s,...) \ 
    [MLog logFile:__FILE__ lineNumber:__LINE__ \ 
     format:(s),##__VA_ARGS__] 
@interface MLog : NSObject { } 
+ (void) logFile: (char*) sourceFile lineNumber: (int) lineNumber format: (NSString*) format, ...; 
+ (void) setLogOn: (BOOL) logOn; 
@end 
#ifndef NDEBUG 
extern void _NSSetLogCStringFunction(void (*)(const char *string, unsigned length, BOOL withSyslogBanner)); 
static void PrintNSLogMessage(const char *string, unsigned length, BOOL withSyslogBanner){ puts(string); } 
static void HackNSLog(void) __attribute__((constructor)); 
static void HackNSLog(void){ _NSSetLogCStringFunction(PrintNSLogMessage); } 
#endif 
static BOOL __MLogOn = NO; 
@implementation MLog 
+ (void) initialize { char * env = getenv("MLogOn"); 
    if (strcmp(env == NULL ? "" : env, "NO") != 0) __MLogOn = YES; 
} 
+ (void) logFile: (char *) sourceFile lineNumber: (int) lineNumber format: (NSString *) format, ...; { 
    va_list ap; NSString *print, *file; 
    if (__MLogOn == NO) return; va_start(ap, format); 
    file = [[NSString alloc] initWithBytes: sourceFile     length:strlen(sourceFile) encoding: NSUTF8StringEncoding]; 
    print = [[NSString alloc] initWithFormat:format arguments: ap]; 
    va_end(ap); // NSLog handles synchronization issues 
    NSLog(@"%s: %d %@", [[file lastPathComponent] UTF8String], lineNumber, print); return; 
} 
+ (void) setLogOn: (BOOL) logOn { __MLogOn = logOn; } 
@end 
+1

¿Es seguro que AppStore? –

12

Este código funcionará

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

-1 para usar stderr –

+0

Muy bonito. @marshaul, ¿por qué stderr es malo de usar? No sé dónde NSLog normalmente escribe. –

+0

No es "malo", simplemente no tiene sentido tener secuencias STDERR y STDOUT separadas. La convención es usar STDOUT para salida "normal" y STDERR para salida "anormal" (errores, etc.). Dado que el usuario puede redirigir explícitamente las secuencias (por ejemplo, redireccionando STDERR a/dev/null), no tiene sentido convertir todo en STDERR. La salida de la consola/terminal sale, y los errores son errores. El punto de todo eso es que STDOUT es (debería ser) el caso normal/predeterminado. –

3

me gusta la solución del Itai. Acabo de modificar el código para usar CFShow en el entorno ARC.

void CFLog(NSString *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 

    CFShow((__bridge CFStringRef)[[NSString alloc] initWithFormat:format arguments:args]); 

    va_end(args); 
} 
2

definir una macro

#if __has_feature(objc_arc) 
    #define DLog(format, ...) CFShow((__bridge CFStringRef)[NSString stringWithFormat:format, ## __VA_ARGS__]); 
#else 
    #define DLog(format, ...) CFShow([NSString stringWithFormat:format, ## __VA_ARGS__]); 
#endif 

y utilizar esta macro en que un código como

NSLog(@"Content with time stamp"); 
DLog(@"Content without time stamp"); 

Aquí está la salida de la consola

NSLog->2014-01-28 10:43:17.873 TestApp[452:60b] Content with time stamp
dlog - >Content without time stamp


P.S.

Si alguien quiere registros personalizados que le proporcionen más información como el nombre del método/número de línea, etc. pueden descargar la fuente abierta MLog.h on GitHub.

+1

@Charles Gracias, estaba a punto de hacer eso. No puedo creer que la edición haya sido aprobada. He votado a favor de rechazar con el comentario "El hecho de que es un enlace lo deja claro. Esta edición es una auto promoción descarada que no agrega ningún valor a la respuesta". –

+1

Cálmense chicos, iOSDeveloperTips tienen un buen sitio y en lugar de dar ningún comentario o lo que sea, deberían haberse puesto en contacto conmigo y yo también les habría ayudado. Pero la idea de 'DMCA' cambió mi opinión y ahora mejoré mi respuesta en términos de ARC. –

+0

Esto no muestra correctamente las letras UTF8 no inglesas. En cambio, muestra su número Unicode (o lo que se llame) como '\ u006z'. –

Cuestiones relacionadas