2010-02-05 6 views
7

Ich bin gerade dabei, meine erste iPhone App einzureichen.Ist es in Ordnung, die iPhone-App-Binärdatei mit NSLog-Anweisungen einzureichen?

Ich habe viele NSLog-Anweisungen zum Testen und Debuggen der Anwendung.

Also meine Frage ist: „Ist es in Ordnung, die NSLog Anweisungen im Quellcode zu halten“

und ich habe einen Zweifel daran, dass, ob die NSLog Aussagen verlangsamen die gesamte Ausführungszeit oder nicht nach unten.

danke.

+1

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

Antwort

9

Ich habe diese ganze Zeit (es irgendwo gefunden):

// 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__) 

Das three20 Projekt von Facebook komplexer Art und Weise zu debuggen oder Protokollierung hat.

+0

können Sie sagen, wo Sie es gefunden haben, damit ich es besser verstehen kann – harshalb

+0

Tut mir leid. Ich habe vergessen, wo es ist. Aber der Quellcode ist beschreibend genug. Sie können es googeln. Wenn ich es finden könnte, könntest du es. –

+1

Es ist von diesem Blog - http://iphoneuncubator.com/blog/debugging/the-evolution-of-a-replacement-for-nslog – deanWombourne

3

Die drei Apps, die ich auf dem Appstore haben mit NSLogs geladen, damit ich es in Ordnung, denke ...

2

Ich habe nie von mir los :)

Einige Leute empfehlen bedingten Compilierung/Compiler-Makros Sie können also ohne NSLog einen Build erstellen, aber ich denke, das ist zu viel Aufwand für sehr wenig Belohnung.

Allerdings verlangsamen NSLogs die App (leicht), so dass ich alle entfernen würde, die sich direkt auf die Leistung auswirken. Außerdem möchten Sie vielleicht einige Debug-Log-Informationen zu entfernen, zu verbergen, wie Sie Ihre App usw.

Hoffnung umgesetzt haben, die hilfreich ist,

Sam

+0

Gute Antwort, aber ich bin mir nicht sicher über die "Ich denke, das ist zu viel Aufwand für sehr wenig Belohnung." Sobald Sie dies einmal getan haben, ist es nicht mehr so ​​schwer, es erneut zu implementieren (dauert höchstens 5 Minuten), wenn Sie ein neues Projekt einrichten. Ich persönlich habe ein DebugLog definiert, das bedingt für Release-Builds zu nichts kompiliert wird, so dass ich NSLog für wirklich wichtige Dinge verwenden kann, die ich in Logs anzeigen möchte. – Kevin

+0

Je nach Anzahl und Inhalt von NSLogs kann die Verlangsamung erheblich sein. Wenn Sie die Beschreibung jedes Objekts in einer Tabelle protokollieren, werden Sie wahrscheinlich eine schlechte Scroll-Leistung feststellen. – FelixLam

+0

@KevinBlair - Sehr wahr, aber ich müsste das Makro schreiben und dann müsste das Team, in dem ich bin, das Makro übernehmen - ich nehme den Weg des geringsten Widerstandes :) (Es wäre schön, wenn es da wäre ein vordefiniertes Makro, das in jedes neue Projekt eingebaut wird) – deanWombourne

6

Eine App Ich arbeitete an perviously hatte viele NSLogs Debug-Dumping zur Konsole. Wir haben festgestellt, dass sie die Leistung auf dem iPhone 3G drastisch beeinträchtigt haben. Der Leistungseinbruch war auf einem 3GS bemerkbar, aber nicht so sehr.

Mein Rat wäre, ein Präprozessor-Makro und eine Debug-Präprozessor-Definition zu verwenden, um NSLogs in Debug-Builds, aber nicht in Release-Builds bedingt zu verwenden.

1

Ich benutze einfach einen "useDebugMode" Singleton int auf 0 oder 1, die in userPrefs (Plist) gespeichert ist. Und, abhängig von der UUID des iPhones, füge ich einen "Benutze Debug Modus: ein/aus" Schalter zum Einstellungsbildschirm hinzu, so dass ich Probleme in der Zukunft mit Produktionsversionen debuggen kann. Dies ermöglicht mir das Debuggen von Datenproblemen (mit heruntergeladenem XML), wenn sich Benutzer über Probleme mit dem Programm in der Zukunft beschweren. Ich dann wickeln alle "NSLog" s und "printf" s in

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

Dies funktioniert für mich ... Natürlich ist die:

if (useDebugLog == 1) 

verursacht einige Overhead, ich bin bereit, Zurecht kommen.

0

Es ist kein Problem mit NSLog in Release. Aber wenn Sie wertvolle Daten in das Protokoll schreiben, können andere Benutzer (Entwickler) diese Daten sehen. Wie ein Download-Link usw.

2

XCode4 bietet eine ziemlich saubere Lösung - verwenden Sie Breakpoints. Wählen Sie die Aktion 'Eine Nachricht protokollieren' und setzen Sie val = @ val @ als die Nachricht, , dann kreuzen Sie das Kästchen 'Automatisch weiter nach der Auswertung der Aktionen' an.

Nicht für jeden Anwendungsfall geeignet, aber es bietet Ihnen den Vorteil, dass Sie die Werte einfach überprüfen können und garantieren, dass sie nicht in ein Release übergehen.

+0

scheint gut eins. Vielen Dank . – harshalb

Verwandte Themen