È ansible NSLog () senza i timestamp e la data e la newline automatica?

NSLog () ha varianti che stampano senza i timestamp e la data e la newline automatica?

Grazie. Ora con il seguente codice, posso stampare NSString, cString o oggetti:

#import  #import  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; } 

Usa printf() invece di NSLog()

Mi ha anche infastidito, così ho scritto una funzione per sostituire NSLog() e 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); } 

Quindi, puoi semplicemente usarlo al posto di NSLog() (es. IFPrint(@"Current date: %@", [NSDate date]) ), ma non stamperà alcun timestamp o una nuova riga e non lo farai devono arrangiarsi con le stringhe e gli array C, e quant’altro. È piuttosto comodo, direi.

Se vuoi, controlla il mio codice completo (ho anche scritto un rimpiazzo per fprintf, scanf e fscanf) qui .
(C’è anche un argomento SO su di esso qui ).

Questo codice funzionerà

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

Mi piace la soluzione di Itai. Ho appena modificato il codice per utilizzare CFShow in ambiente ARC.

 void CFLog(NSString *format, ...) { va_list args; va_start(args, format); CFShow((__bridge CFStringRef)[[NSString alloc] initWithFormat:format arguments:args]); va_end(args); } 

Definire 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 

E usa questa macro come codice

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

Ecco l’output della console

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


PS

Se qualcuno vuole Log personalizzati che ti dà più informazioni come nome del metodo / numero di linea ecc. Puoi scaricare il codice MLog.h on GitHub open source MLog.h on GitHub .

la PRIMA cosa che faccio su QUALSIASI progetto è la caduta (la mia versione condensata di) di questa class … che elimina TUTTI i NONSENSE in NSLog … Metti questo nella parte superiore di un file .m – e l’output della tua console sarà PERFETTO .

 #import  #import  #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