tutorial objective example español objective-c

objective-c - example - objective c vs c++



¿Es posible NSLog() sin las marcas de fecha y hora, y la nueva línea automática? (6)

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

Gracias. Ahora, con el siguiente código, puedo imprimir NSString, cString 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; }


Define 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 usa esta macro en tu 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

PD

Si alguien quiere Registros personalizados que le MLog.h on GitHub más información, como nombre de método / número de línea, etc., puede descargar el código abierto MLog.h on GitHub .


Este código funcionará

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


Lo PRIMERO que hago en CUALQUIER proyecto es dejar caer (mi versión condensada de) esta clase ... que elimina TODOS LOS INCIDIDOS en NSLog ... Coloque esto en la parte superior de un archivo .m - y la salida de su consola será PERFECTA .

#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


Me gusta la solución de Itai. Acabo de modificar el código para usar CFShow en un 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); }


También me molestó, así que escribí 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, solo puede usarlo en lugar de NSLog() (por ejemplo, IFPrint(@"Current date: %@", [NSDate date]) ), pero no imprimirá ninguna marca de tiempo ni una nueva línea, y no Tengo que meterse con las cadenas y arreglos en C, y todo eso. Es bastante práctico, 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 al respecto here ).


Use printf() lugar de NSLog()