2010-08-15 5 views
21

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

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

#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

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

risposta

19

Uso printf() invece di NSLog()

+0

Ha printf() supporta NSString? –

+4

@Stephen no, dovresti usare qualcosa come 'printf ("% s% s \ n ", [someString UTF8String], [[someObject description] UTF8String])' – cobbal

+0

No, è una funzione C. Quindi dovresti convertire NSString in un array di caratteri.Quindi 'printf ([myString cStringUsingEncoding: NSASCIIStringEncoding]);' – NebulaFox

14

E mi dava fastidio troppo, 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, è possibile utilizzarlo al posto di NSLog() (ad esempio IFPrint(@"Current date: %@", [NSDate date])), ma non stamperà alcun timestamp o una nuova riga, e non si deve scherzare con C s trings e array, e quant'altro. È piuttosto comodo, direi.

Se si desidera, controllare il mio codice completo (Ho anche scritto una sostituzione per fprintf, scanf e fscanf) here.
(C'è anche un argomento SO su di esso here).

2

la prima cosa che faccio su qualsiasi progetto è calo (la mia versione condensata) this class ... che si sbarazza del tutte le sciocchezze in NSLog ... Mettere questo nella parte superiore di un file .m - e la console l'output sarà PERFETTO.

#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

L'AppStore è sicuro? –

12

Questo codice funzionerà

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

-1 per l'utilizzo dello stderr –

+0

Molto bello. @marshaul, perché lo stderr è cattivo da usare? Non so dove NSLog scriva normalmente. –

+0

Non è "cattivo", manca semplicemente il punto di avere flussi STDERR e STDOUT separati. La convenzione prevede di utilizzare STDOUT per l'output "normale" e STDERR per l'output "anormale" (errori, ecc.). Poiché l'utente può reindirizzare esplicitamente gli stream (ad esempio reindirizzando STDERR a/dev/null), non ha senso collegare tutto a STDERR. L'uscita console/terminale viene emessa e gli errori sono errori. Il punto di tutto ciò è che STDOUT è (dovrebbe essere) il caso normale/predefinito. –

3

mi piace la soluzione del 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); 
} 
2

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 utilizzare questa macro in voi codice come

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

Ecco l'output di console

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


P.S.

Se qualcuno desidera registri personalizzati che forniscono ulteriori informazioni come il nome del metodo/numero di linea ecc., È possibile scaricare l'open source MLog.h on GitHub.

+1

@Charles Grazie, stavo proprio per farlo. Non posso credere che la modifica sia stata approvata. Ho votato per respingere con il commento "Il fatto che sia un collegamento lo rende chiaro: questa modifica è un'auto-promozione sfacciata che non aggiunge alcun valore alla risposta". –

+1

Calmati ragazzi, iOSDeveloperTips hai un buon sito e invece di dare qualsiasi commento o qualsiasi altra cosa, avresti dovuto contattarmi e avrei anche aiutato te. Ma l'idea di 'DMCA' ha cambiato idea e ora ho migliorato la mia risposta in termini di ARC. –

+0

Questo non mostra correttamente le lettere non inglesi UTF8. Mostra invece il loro numero unicode (o come si chiama) come '\ u006z'. –

Problemi correlati