2010-11-08 16 views
6

Come programmatore più recente, ho scoperto la magia di NSlog e l'ho usato tutto attraverso il mio codice. È stato estremamente utile (insieme a NSZombieEnabled) nel debug.C'è un costo per usare liberamente NSLog?

Vedo un risultato preciso sul simulatore mentre stampa tutto questo. Non penso di vedere alcun risultato simile sui dispositivi, ma non ne sono sicuro.

Quindi non costa nulla lasciare lo NSLogs? Sta usando più memoria sul dispositivo? O il compilatore li ignora, come fa i commenti quando compilo per un dispositivo?

EDIT:

Ecco quello che ho implementato, secondo il suggerimento di rano.

Nel mio file App_Prefix.pch, ho aggiunto:

// DLog is almost a drop-in replacement for NSLog 
// DLog(); 
// DLog(@"here"); 
// DLog(@"value: %d", x); 
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead  DLog(@"%@", aStringVariable); 
#ifdef DEBUG 
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 
#else 
# define DLog(...) 
#endif 

// ALog always displays output regardless of the DEBUG setting 
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); 

E poi nel mio Project Info ispettore, per la configurazione Debug , sotto la voce GCC 4.2 - Preprocessing, ho aggiunto il valore DEBUG alla voce in alto chiamata, Preprocessor Macros.

Funziona come un incantesimo - DLog uscite quando si genera una versione Debug e sempre uscite.

+0

Vedere anche [È vero che non si dovrebbe utilizzare NSLog() sul codice di produzione?] (Http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use -nslog-on-production-code) –

risposta

7

NSLog sicuramente è più caro di un semplice printf ma è un po 'più integrato nel quadro Objective-C e Cocoa.

Tra l'altro quando si è seriamente la programmazione si noterà che non è sufficiente per la maggior parte delle vostre esigenze. Dai uno sguardo a questo article e ai suoi riferimenti per avere un'idea su come sostituirlo in modo intelligente.

In questo modo è anche possibile fare in modo che il compilatore lo ignori quando non è più utile (ad es. Quando rilascerai il tuo pezzo di codice). In generale, è possibile eseguire il #ifdef la chiamata a una funzione di registro nel calcolo di cicli intensi/sequenze di codice.

+4

Volevo solo pubblicare lo stesso link. Soprattutto il commento 15 di Bill Hollings vale la pena guardare –

+0

@fluchtpunkt sì, headr è utile. Anche se preferisco un nome più breve per la mia funzione di logging, qualcosa come 'DNSLog' e in questo modo posso facilmente convertire i precedenti – rano

0

NSLog non è implementato come una macro, quindi ci sarà sicuramente un costo. Quantificarlo e decidere se è importante è più difficile. L'unico modo sicuro per farlo è misurare la tua applicazione.

0

Le risposte sopra non sono aggiornate. Dovresti semplicemente usare CocoaLumberjack è di gran lunga superiore a NSLog e offre molte più funzionalità rispetto alle risposte di cui sopra.