452 Stimmen

Wie kann man den Methodennamen und die Zeilennummer ausgeben und NSLog bedingt deaktivieren?

Ich mache eine Präsentation über das Debugging in Xcode und würde gerne mehr Informationen über die effiziente Verwendung von NSLog erhalten.

Ich habe vor allem zwei Fragen:

  • gibt es eine Möglichkeit, einfach NSLog die aktuelle Methode Name / Zeilennummer?
  • Gibt es eine Möglichkeit, alle NSLogs vor dem Kompilieren für den Release-Code einfach zu deaktivieren?

13 Stimmen

erste Frage, bei der Favoriten (Sterne) mehr als Upvotes sind... +1..

16voto

Marc Charbonneau Punkte 40221

Meine Antwort an diese Frage könnte helfen, es sieht aus, als wäre es ähnlich wie das, was Diederik ausgearbeitet hat. Vielleicht möchten Sie auch den Aufruf von NSLog() mit einer statischen Instanz Ihrer eigenen benutzerdefinierten Protokollierungsklasse. Auf diese Weise können Sie ein Prioritätsflag für Debug-/Warn-/Fehlermeldungen hinzufügen, Meldungen sowohl an eine Datei oder Datenbank als auch an die Konsole senden oder so ziemlich alles andere, was Ihnen einfällt.

#define DEBUG_MODE

#ifdef DEBUG_MODE
    #define DebugLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, 
              [[NSString stringWithUTF8String:__FILE__] lastPathComponent], 
              __LINE__, 
              [NSString stringWithFormat:(s), 
              ##__VA_ARGS__] )
#else
    #define DebugLog( s, ... ) 
#endif

0 Stimmen

Weil du ausgewichen bist %s Formatangabe, die Apple versucht, zu verwerfen und zu vermeiden -Wcstring-format-directive Die Clang-Warnung wurde 2015 neu eingeführt.

13voto

chunkyguy Punkte 3362

Deaktivieren aller NSLogs, für jemanden, der allergisch gegen MACROS ist, hier ist etwas, das Sie auch kompilieren können:

void SJLog(NSString *format,...)
{
    if(LOG)
    {   
        va_list args;
        va_start(args,format);
        NSLogv(format, args);
        va_end(args);
    }
}

Und verwenden Sie es fast wie NSLog:

SJLog(@"bye bye NSLogs !");

Von diesem Blog: https://whackylabs.com/logging/ios/2011/01/19/ios-moving-in-and-out-of-nslogs/

12voto

AddisDev Punkte 1751

Es ist einfach, Ihre bestehenden NSLogs so zu ändern, dass sie die Zeilennummer und die Klasse, von der sie aufgerufen werden, anzeigen. Fügen Sie eine Codezeile in Ihre Präfix-Datei ein:

#define NSLog(__FORMAT__, ...) NSLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)

3 Stimmen

Das ist großartig! Wie würden Sie das in Swift machen?

0 Stimmen

@AddisDev Das gefällt mir am besten. Sehr sauber und einfach. Ich benutze nur NSLog. Ich habe sowieso keine Ahnung, was DLog & ULog sind! Danke! Hochgestimmt...

0 Stimmen

@AddisDev Ich verstehe wirklich nicht, warum Apple diese lebenswichtigen Daten nicht standardmäßig zu NSLog() hinzufügt? Bizarr...

11voto

Quinn Taylor Punkte 44113

Ergänzend zu den obigen Antworten kann es in bestimmten Situationen recht nützlich sein, einen Ersatz für NSLog zu verwenden, insbesondere bei der Fehlersuche. Zum Beispiel kann das Weglassen aller Datums- und Prozessname/ID-Informationen in jeder Zeile die Ausgabe lesbarer machen und das Booten beschleunigen.

Der folgende Link enthält eine Menge nützlicher Materialien, mit denen sich die einfache Protokollierung viel schöner gestalten lässt.

http://cocoaheads.byu.edu/wiki/a-different-nslog

9voto

Venkat Reddy Punkte 111

Es ist ganz einfach, zum Beispiel

-(void)applicationWillEnterForeground:(UIApplication *)application {

    NSLog(@"%s", __PRETTY_FUNCTION__);

}

Sortie : -[AppDelegate applicationWillEnterForeground:]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X