webentwicklung-frage-antwort-db.com.de

NSLog den Methodennamen mit Objective-C im iPhone

Derzeit definieren wir uns einen erweiterten Protokollmechanismus, um den Klassennamen und die Quellzeilennummer des Protokolls auszudrucken. 

#define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \
    __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__])

Wenn ich beispielsweise NCLog anrufe (@ "Hallo Welt"); Die Ausgabe lautet:

<ApplicationDelegate:10>Hello world

Nun möchte ich auch den Methodennamen abmelden wie:

<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world

Dies würde unser Debugging einfacher machen, wenn wir wissen, welche Methode aufgerufen wird. Ich weiß, dass wir auch einen Xcode-Debugger haben, aber manchmal möchte ich auch das Debuggen durchführen, indem ich mich abmeldet.

142
vodkhang
print(__FUNCTION__) // Swift
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C

Swift 3 und höher

print(#function)
247
drawnonward

Um Ihre Frage technisch zu beantworten, möchten Sie:

NSLog(@"<%@:%@:%d>", NSStringFromClass([self class]), NSStringFromSelector(_cmd), __LINE__);

Oder Sie könnten auch:

NSLog(@"%s", __PRETTY_FUNCTION__);
157
Dave DeLong

tl; dr

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

Einzelheiten

Apple hat eine Seite mit technischen Fragen und Antworten: QA1669 - Wie kann ich meinen Protokollierungsanweisungen Kontextinformationen wie die aktuelle Methode oder Zeilennummer hinzufügen?

So unterstützen Sie die Protokollierung:

  • Der C-Präprozessor stellt einige Makros zur Verfügung.
  • Objective-C liefert Ausdrücke (Methoden).
    • Übergeben Sie das implizite Argument für den Selektor der aktuellen Methode: _cmd

Um den Namen der aktuellen Methode zu erhalten, rufen Sie, wie in anderen Antworten angegeben, Folgendes auf:

NSStringFromSelector(_cmd)

Verwenden Sie diese beiden Makros __func__ Und __LINE__, Um den aktuellen Methodennamen nd aktuelle Zeilennummer abzurufen:

NSLog(@"%s:%d someObject=%@", __func__, __LINE__, someObject);

Ein weiteres Beispiel… Codeausschnitte, die ich in der Codeausschnittbibliothek von Xcode aufbewahre:

NSLog( @"ERROR %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

… Und TRACE statt ERROR…

NSLog( @"TRACE %@ METHOD %s:%d ", @"DescriptionGoesHere", __func__, __LINE__ );

… Und eine längere mit einer softcodierten Beschreibung, die einen Wert übergibt ([rows count])…

NSLog( @"TRACE %@ METHOD %s:%d.", [NSString stringWithFormat:@"'Table of Contents.txt' file's count of Linefeed-delimited rows: %u.", [rows count]] , __func__, __LINE__ );

Präprozessor-Makros für die Protokollierung

Beachten Sie die Verwendung eines Unterstrichpaares um beide Seiten des Makros.

 | Makro | Format | Beschreibung 
 __Func__% s Aktuelle Funktionssignatur 
 __LINE__% d Aktuelle Zeilennummer 
 __FILE__% s Vollständiger Pfad zur Quelldatei 
 __PRETTY_FUNCTION__% s Wie __func__, enthält jedoch ausführliche Informationen 
 Geben Sie Informationen in C++ ein. 

Ausdrücke für die Protokollierung

 | Ausdruck | Format | Beschreibung 
 NSStringFromSelector (_cmd)% @ Name des aktuellen Selektors 
 NSStringFromClass ([Selbstklasse])% @ Klassenname des aktuellen Objekts 
 [[NSString% @ Name der Quellcodedatei 
 stringWithUTF8String: __ FILE__] 
 lastPathComponent] 
 [NSThread callStackSymbols]% @ NSArray of stack trace 

Protokollierungsframeworks

Einige Protokollierungsframeworks helfen möglicherweise auch beim Abrufen der aktuellen Methode oder Zeilennummer. Ich bin mir nicht sicher, da ich in Java ( SLF4J + LogBack ) ein großartiges Protokollierungsframework verwendet habe, aber nicht in Cocoa.

Siehe diese Frage für Links zu verschiedenen Cocoa-Protokollierungsframeworks.

Name des Selektors

Wenn Sie eine Selector-Variable haben (a SEL ), können Sie den Methodennamen ("message") auf zwei Arten ausgeben, wie im Folgenden beschrieben. CodecBlogpost :

  • Aufruf von Objective-C an NSStringFromSelector :
    NSLog(@"%@", NSStringFromSelector(selector) );
  • Verwenden Sie gerade C:
    NSLog(@"%s", selector );

Diese Informationen stammen von der verlinkten Seite Apple doc vom 19.07.2013. Diese Seite wurde zuletzt am 04.10.2011 aktualisiert.

78
Basil Bourque
NSLog(@"%@", NSStringFromSelector(_cmd)); // Objective-C
print(__FUNCTION__) // Swift
8
Huynh Inc

Es ist eigentlich so einfach wie:

printf(_cmd);

Aus irgendeinem Grund lässt es zu, dass _cmd als literale Zeichenfolge übergeben wird, nicht einmal eine Kompilierwarnung. Wer weiß

0
Albert Renshaw

In Swift 4:

func test () {

print(#function)

}

test () // drucke den Wert "test ()"

0
Ankit garg