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__])
Zum Beispiel, wenn ich NCLog aufrufe (@ "Hallo Welt"); Die Ausgabe wird sein:
<ApplicationDelegate:10>Hello world
Jetzt möchte ich auch den Methodennamen wie folgt abmelden:
<ApplicationDelegate:applicationDidFinishLaunching:10>Hello world
Dies würde unser Debuggen einfacher machen, wenn wir wissen, welche Methode aufgerufen wird. Ich weiß, dass wir auch einen Xcode-Debugger haben, aber manchmal möchte ich das Debuggen auch durch Abmelden durchführen.
objective-c
c
iphone
debugging
Wodkhang
quelle
quelle
iPhone
Projekt habe ich dies tatsächlich manuell gemacht. Würde gerne die Antwort darauf sehen.Antworten:
Swift 3 und höher
quelle
NSLog(@"%@", NSStringFromSelector(_cmd))
, wenn Sie es verwenden_cmd
möchten, da AFAIK Apple_cmd
als Typ deklariertSEL
, nicht als C-String. Nur weil es zufällig als C-String implementiert ist (ab den aktuellen Versionen von Mac OS X und iPhone OS), heißt das nicht, dass Sie es auf diese Weise verwenden sollten, da Apple es in einem Betriebssystem-Update ändern könnte.[self doSomething:arg1 somethingElse:arg2]
werden in den C-Funktionsaufruf konvertiertobjc_msgSend(self, "doSomething:somethingElse:, arg1, arg2);
. Der zweite Parameter vonobjc_msgSend()
nimmt achar*
. Denken Sie daran, dass die Objective-C-Laufzeit dynamisch ist und tatsächlich eine Nachschlagetabelle verwendet, um herauszufinden, welche Methode für welche Klasse aufgerufen werden soll. Daher ist ein char * praktisch, da Methoden in der Nachschlagetabelle als Zeichenfolgen dargestellt werden.print("\(#function)")
Um Ihre Frage technisch zu beantworten, möchten Sie:
Oder Sie könnten auch tun:
quelle
__FUNCTION__
und seinem hübschen Äquivalent ist es auch in C-Funktionen verfügbar.__FUNCTION__
enthält auch den Klassennamentl; dr
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:
_cmd
Rufen Sie, wie in anderen Antworten angegeben, Folgendes auf, um lediglich den Namen der aktuellen Methode zu erhalten:
Um die aktuellen Methodennamen zu erhalten und aktuelle Zeilennummer, verwenden Sie diese beiden Makros
__func__
und__LINE__
wie hier zu sehen:Ein weiteres Beispiel… Codeausschnitte, die ich in der Code-Snippet-Bibliothek von Xcode aufbewahre:
… Und TRACE statt ERROR…
… Und eine längere mit einer weichcodierten Beschreibung, die einen Wert (
[rows count]
) übergibt …Präprozessor-Makros für die Protokollierung
Beachten Sie die Verwendung von zwei Unterstrichen auf beiden Seiten des Makros.
Ausdrücke für die Protokollierung
Protokollierungs-Frameworks
Einige Protokollierungsframeworks können auch beim Abrufen der aktuellen Methode oder Zeilennummer hilfreich sein. Ich bin mir nicht sicher, da ich ein großartiges Protokollierungsframework in Java ( SLF4J + LogBack ) verwendet habe, aber nicht Cocoa.
In dieser Frage finden Sie Links zu verschiedenen Cocoa-Protokollierungsframeworks.
Name des Selektors
Wenn Sie eine Selector-Variable (ein SEL ) haben, können Sie den Methodennamen ("message") auf zwei Arten drucken, wie in diesem Codec- Blogbeitrag beschrieben :
NSLog(@"%@", NSStringFromSelector(selector) );
NSLog(@"%s", selector );
Diese Informationen stammen aus der verlinkten Apple-Dokumentseite vom 19.07.2013. Diese Seite wurde zuletzt am 04.10.2011 aktualisiert.
quelle
sel_getName(SEL)
da SEL ein undurchsichtiger Typ ist und möglicherweise nicht immer einchar *
quelle
Es ist eigentlich genauso einfach wie:
Aus irgendeinem Grund erlaubt iOS, _cmd als Literalzeichen ohne Kompilierungswarnung zu übergeben. Wer weiß
quelle
In Swift 4:
func test () {
}}
test () // drucke den Wert "test ()"
quelle