Was ist das Objective-C-Äquivalent für "toString ()" zur Verwendung mit NSLog?

170

Gibt es eine Methode, die ich in meinen benutzerdefinierten Klassen überschreiben kann, damit wann

      NSLog(@"%@", myObject) 

heißt, wird es die Felder (oder was auch immer ich für wichtig halte) meines Objekts drucken? Ich denke, ich suche nach dem Objective-C-Äquivalent von Java toString().

George Armhold
quelle

Antworten:

250

Es ist die descriptionInstanzmethode, deklariert als:

- (NSString *)description

Hier ist eine Beispielimplementierung (dank Grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}
zakovyrya
quelle
5
Hinweis: Wenn Sie CoreData verwenden, ist die descriptionEigenschaft reserviert ... und bietet nützliche Debugging-Informationen! In diesem Fall müssen Sie Ihren eigenen eindeutigen Methodennamen erstellen.
Kleiber
Ist debugDescriptionauch reserviert? Obwohl ich denke DebugDescription, dass es von einem Debugger wie LLDB verwendet werden soll.
MaddTheSane
36

Fügen Sie dies zu @implementationIhrer Fotoklasse hinzu:

- (NSString *)description {
   return [NSString stringWithFormat:@"Photo: Name=%@ Author=%@",name,author];
}
Grahamparks
quelle
24

Sie können die Beschreibungsmethode von NSObject überschreiben:

- (NSString *)description

Zum Thema Protokollierung empfehle ich diesen Blog-Beitrag zur besseren Protokollierung in Objective-C.

Teabot
quelle
4
Ist das nicht eine statische Methode? Ich möchte, dass dies eher auf Objekte als auf die Klasse angewendet wird. Wenn ich beispielsweise eine "Foto" -Klasse mit den Feldern "Name" und "Autor" habe, möchte ich, dass NSLog diese Felder so druckt, wie sie im Objekt zugewiesen sind.
George Armhold
2
Ja - gut entdeckt - ich habe die falsche Taste gedrückt. Ich sollte beim Korrekturlesen meiner Antworten eindeutig mehr Aufmerksamkeit schenken. Zum Glück hatte jemand den Ball im Auge :-)
Teabot
13

Es gibt zwei Funktionen, die Sie verwenden können.

- (NSString*)description

Dies wird angezeigt, wenn Sie Ihr Objekt als, IE als Parameter für setzen NSLog. Die andere Beschreibungsfunktion ist:

- (NSString*)debugDescription

Dies wird aufgerufen, wenn Sie dies po anInstanceOfYourClassim Debug-Befehlsfenster tun . Wenn Ihre Klasse keine debugDescriptionFunktion hat, dann einfachdescription wird nur aufgerufen.

Beachten Sie, dass die Basisklasse NSObjectzwar descriptionimplementiert wurde, aber ziemlich einfach ist: Sie zeigt nur die Adresse des Objekts an. Aus diesem Grund empfehle ich, dass Sie descriptionin jeder Klasse implementieren , aus der Sie Informationen abrufen möchten, insbesondere wenn Sie die descriptionMethode in Ihrem Code verwenden. Wenn Sie descriptionin Ihrem Code verwenden, schlage ich vor, dass Sie auch implementieren debugDescriptionund auch debugDescriptionausführlicher machen.

MaddTheSane
quelle
1

Dadurch werden die verfügbaren Stimmen ausgegeben:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
grigb
quelle