2010-02-05 9 views
7

Sto per inviare la mia prima app per iPhone.Va bene inviare il binario dell'app iPhone con le istruzioni NSLog?

Ho inserito molte istruzioni NSLog per testare e eseguire il debug dell'applicazione.

Quindi la mia domanda è "E 'ok per mantenere le dichiarazioni NSLog nel codice sorgente"

e ho un dubbio che se il bilancio NSLog rallenta il tempo totale di esecuzione o meno.

grazie.

+1

Vedere http://stackoverflow.com/questions/300673/is-it-true-that-one-should-not-use-nslog-on-production-code – Vladimir

risposta

9

Ho usato tutto il tempo (che si trova da qualche parte):

// DLog is almost a drop-in replacement for NSLog to turn off logging for release build 
// 
// add -DDEBUG to OTHER_CFLAGS in the build user defined settings 
// 
// Usage: 
// 
// 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(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 
#else 
# define DLog(...) do {} while (0) 
#endif 
// ALog always displays output regardless of the DEBUG setting 
#define ALog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 

Il progetto Three20 da Facebook ha modo più complesso per eseguire il debug o la registrazione.

+0

puoi dire dove l'hai trovato, così posso comprenderlo meglio – harshalb

+0

Mi dispiace. Ho dimenticato dov'è. Ma il codice sorgente è abbastanza descrittivo. Puoi google it. Se potessi trovarlo, potresti. –

+1

È da questo blog - http://iphoneincubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog – deanWombourne

3

Le tre applicazioni che ho su AppStore sono caricati con NSLogs quindi immagino che va bene ...

2

ho mai sono liberato del mio :)

Qualcuno raccomanda condizionali di compilazione/macro compilatore quindi puoi creare una build senza NSLog, ma penso che sia troppo impegnativo per una piccola ricompensa.

Tuttavia, NSLogs rallenta l'app (leggermente) in modo da rimuovere quelli che influiscono direttamente sulle prestazioni. Inoltre, si potrebbe desiderare di rimuovere alcune debug informazioni di registrazione di nascondere quanto è stato implementato la vostra applicazione ecc

Speranza che è utile,

Sam

+0

Buona risposta ma non sono sicuro del "Penso che sia troppo sforzo per una piccola ricompensa." Una volta che hai fatto questo, non è difficile implementarlo di nuovo (impiega al massimo 5 minuti) quando imposti un nuovo progetto. Personalmente ho definito un DebugLog che è compilato in modo condizionale a zero per le build di rilascio, lasciandomi NSLog da usare per cose veramente importanti che vorrei mostrare nei log. – Kevin

+0

A seconda del numero e del contenuto di NSlog, il rallentamento può essere considerevole. Se si registra la descrizione di ciascun oggetto in una tabella, è probabile che si verifichi una prestazione di scorrimento scadente. – FelixLam

+0

@KevinBlair - Veramente vero, ma dovrei scrivere la macro e poi la squadra su cui mi trovo avrebbe tutti bisogno di adottare la macro - Sto prendendo il percorso di minor resistenza :) (Sarebbe bello se ci fosse una macro predefinita incorporata in ogni nuovo progetto) – deanWombourne

6

Un'app stavo lavorando su perviously avevo molte NSLogs scarico di debug alla console. Abbiamo scoperto che hanno ostacolato drasticamente le prestazioni su iPhone 3G. Il successo della performance è stato evidente su un 3GS, ma non così tanto.

Il mio consiglio sarebbe di utilizzare una macro del preprocessore e una definizione del preprocessore di debug per utilizzare in modo condizionale NSlog nei build di debug ma non nelle build di rilascio.

1

Io uso semplicemente un "singleDebugMode" singleton int impostato su 0 o 1 che è memorizzato in userPrefs (plist). E, a seconda dell'UUID dell'iphone, aggiungo un "Usa modalità debug: on/off" per passare alla schermata delle impostazioni in modo da poter eseguire il debug dei problemi in futuro con le versioni di produzione. Questo mi consente di eseguire il debug dei problemi relativi ai dati (con XML scaricato) se le persone si lamentano di problemi con il programma in futuro. Ho poi avvolgere tutte le s "NSLog" e "s printf" in

if (useDebugLog == 1) 
{ 
    NSLog(@"debug statement"); 
} 

Questo funziona per me ... Certo, il:

if (useDebugLog == 1) 

provoca alcuni in testa che io sono disposto a avere a che fare con.

0

Non è un problema di utilizzo di NSLog nella versione. Ma se metti dei dati preziosi nel log, un altro utente (sviluppatore) può vedere quei dati. Come qualche link per il download, ecc.

2

XCode4 offre una soluzione molto carina - utilizzare i breakpoint. seleziona l'azione 'registra un messaggio' e imposta val = @ val @ come il messaggio, quindi seleziona la casella 'continua automaticamente dopo aver valutato le azioni'.

Non si adatta a tutti i casi d'uso, ma offre il vantaggio di un facile 'controllo' di valori e garantisce che non saranno convertiti in versione.

+0

sembra buono. Grazie . – harshalb