Ich mache eine Präsentation zum Debuggen in Xcode und möchte weitere Informationen zur effizienten Verwendung von NSLog erhalten.
Insbesondere habe ich zwei Fragen:
- Gibt es eine Möglichkeit, den Namen / die Zeilennummer der aktuellen Methode einfach zu NSLog?
- Gibt es eine Möglichkeit, alle NSLogs einfach zu "deaktivieren", bevor sie für den Release-Code kompiliert werden?
objective-c
cocoa
cocoa-touch
xcode
nslog
Zügel
quelle
quelle
Antworten:
Hier sind einige nützliche Makros rund um NSLog, die ich häufig benutze:
Das DLog-Makro wird nur verwendet, wenn die Variable DEBUG gesetzt ist (-DDEBUG in den C-Flags des Projekts für die Debug-Konfiguration).
ALog gibt immer Text aus (wie das normale NSLog).
Die Ausgabe (zB ALog (@ "Hallo Welt")) sieht folgendermaßen aus:
quelle
(@"%s [Line %d] " fmt)
dass dasfmt
an die Steuerzeichenfolge angehängt wird? Ich habe diese Syntax außer diesem Debug-Makro nicht gesehen.Ich habe
DLog
undALog
von oben genommen und hinzugefügt,ULog
was eineUIAlertView
Nachricht auslöst.Zusammenfassen:
DLog
wird wieNSLog
nur ausgegeben, wenn die Variable DEBUG gesetzt istALog
wird immer wie ausgegebenNSLog
ULog
wirdUIAlertView
nur angezeigt, wenn die Variable DEBUG gesetzt istSo sieht es aus:
+1 Diederik
quelle
DLog
Anweisung setzen. Dies ist nützlich, da in Release-BuildsDLog
nichts kompiliert wird und in Ihrem Code ein baumelndes Semikolon verbleibt. Dies ist kein Fehler, kann jedoch abhängig von Ihren Einstellungen eine Warnung auslösen, wenn ein anderes Semikolon verwendet wird.Gibt Dateinamen, Zeilennummer und Funktionsnamen aus:
__FUNCTION__
in C ++ zeigt verstümmelter Name__PRETTY_FUNCTION__
zeigt schönen Funktionsnamen, in Kakao sehen sie gleich aus.Ich bin mir nicht sicher, wie NSLog richtig deaktiviert werden kann. Ich habe Folgendes getan:
Es wurde keine Protokollausgabe angezeigt, ich weiß jedoch nicht, ob dies Nebenwirkungen hat.
quelle
Hier eine große Sammlung von Debug-Konstanten, die wir verwenden. Genießen.
quelle
Es gibt einen neuen Trick, den keine Antwort gibt. Sie können
printf
stattdessen verwendenNSLog
. Dadurch erhalten Sie ein sauberes Protokoll:Mit
NSLog
Ihnen bekommen solche Dinge:Aber mit
printf
dir bekommst du nur:Verwenden Sie diesen Code
quelle
Meine Antwort auf diese Frage könnte helfen, sieht aus wie die, die Diederik sich ausgedacht hat. Möglicherweise möchten Sie den Aufruf auch
NSLog()
durch eine statische Instanz Ihrer eigenen benutzerdefinierten Protokollierungsklasse ersetzen. Auf diese Weise können Sie ein Prioritätsflag für Debug- / Warn- / Fehlermeldungen hinzufügen, Nachrichten an eine Datei oder Datenbank sowie an die Konsole senden oder so ziemlich alles, was Sie sich sonst noch vorstellen können.quelle
%s
Formatbezeichner ausgewichen sind, den Apple zu verachten versucht, und die-Wcstring-format-directive
2015 neu eingeführte Clang-Warnung vermieden haben .Wenn Sie alle NSLogs deaktivieren, können Sie für jemanden, der gegen MACROS allergisch ist, Folgendes kompilieren:
Und verwenden Sie es fast wie NSLog:
Aus diesem Blog: https://whackylabs.com/logging/ios/2011/01/19/ios-moving-in-and-out-of-nslogs/
quelle
Um die obigen Antworten zu ergänzen, kann es in bestimmten Situationen, insbesondere beim Debuggen, sehr nützlich sein, einen Ersatz für NSLog zu verwenden. Wenn Sie beispielsweise alle Informationen zu Datum und Prozessname / ID in jeder Zeile entfernen, kann die Ausgabe besser lesbar und schneller gestartet werden.
Der folgende Link bietet eine Menge nützlicher Munition, um die einfache Protokollierung zu vereinfachen.
http://cocoaheads.byu.edu/wiki/a-different-nslog
quelle
Es ist einfach, Ihre vorhandenen NSLogs so zu ändern, dass Zeilennummer und Klasse angezeigt werden, von denen sie aufgerufen werden. Fügen Sie Ihrer Präfixdatei eine Codezeile hinzu:
quelle
Es ist zum Beispiel einfach
Ausgabe: - [AppDelegate applicationWillEnterForeground:]
quelle
Aufbauend auf den obigen Antworten habe ich Folgendes plagiiert und erfunden. Außerdem wurde die Speicherprotokollierung hinzugefügt.
quelle
Neuzugang bei DLog. Deaktivieren Sie das Debug nur aus der freigegebenen Anwendung, anstatt es vollständig zu entfernen. Wenn der Benutzer Probleme hat, die ein Debuggen erfordern würden, teilen Sie ihm einfach mit, wie das Debuggen in der freigegebenen Anwendung aktiviert werden soll, und fordern Sie Protokolldaten per E-Mail an.
Kurzversion: Erstellen Sie eine globale Variable (ja, faule und einfache Lösung) und ändern Sie DLog wie folgt:
Längere Antwort bei Jomnius iLessons iLearned: Dynamische Debug-Protokollierung in freigegebenen Anwendungen
quelle
Seit einiger Zeit verwende ich eine Seite mit Makros, die von mehreren oben übernommen wurden. Mein Fokus liegt auf der Anmeldung in der Konsole, wobei der Schwerpunkt auf kontrollierter und gefilterter Ausführlichkeit liegt . Wenn Ihnen viele Protokollzeilen nichts ausmachen, Sie aber Stapel von ihnen einfach ein- und ausschalten möchten, ist dies möglicherweise hilfreich.
Zuerst ersetze ich optional NSLog durch printf, wie oben von @Rodrigo beschrieben
Als nächstes schalte ich die Anmeldung ein oder aus.
Definieren Sie im Hauptblock verschiedene Kategorien , die Modulen in Ihrer App entsprechen. Definieren Sie auch eine Protokollierungsstufe , über der Protokollierungsaufrufe nicht aufgerufen werden. Dann definieren verschiedene Aromen von NSLog Ausgang
Mit den aktuellen Einstellungen für kLOGIFcategory und kLOGIFdetailLTEQ kann ein Anruf wie
wird gedruckt, aber das wird nicht
noch wird
Wenn Sie die Einstellungen für einen einzelnen Protokollaufruf überschreiben möchten, verwenden Sie eine negative Ebene:
Ich finde, dass die wenigen zusätzlichen Zeichen für die Eingabe jeder Zeile so viel wert sind, wie ich kann
Ich bin mir sicher, dass viele dies als etwas übertrieben empfinden werden, aber nur für den Fall, dass jemand findet, dass es zu ihren Zwecken passt.
quelle