2009-12-14 9 views
5

Ich möchte eine beschreibende Zeichenfolge für ein Objekt in Cocoa haben. Ich denke über das Überschreiben der Beschreibungsmethode oder der StringValue-Methode nach. Was ist vorzuziehen und warum? Die einzige Richtlinie, die ich finden konnte, war in here unter Angabeüberschreiben Beschreibung oder StringValue in Kakao?

Sie sind entmutigt von überschreiben Beschreibung.

Ist das in der Tat, was Sie vorschlagen würden? Irgendein anderer bevorzugter Übergriffspunkt?

+1

Ihr Link ist zu der Dokumentation für Core Data - Möchten Sie die Beschreibungsmethode für ein NSManagedObject oder etwas anderes überschreiben? –

+0

Ich glaube nicht - es ist eine NSObject-Unterklasse, die Daten für eine räumliche Bounding Box und einige Operationen darauf enthält. Die String-Beschreibung ist im Grunde eine durch Komma getrennte Liste der linken unteren und oberen rechten Koordinaten. – mvexel

Antwort

5

description ist der Weg zu gehen, das ist, was es heißt String-Darstellung eines Objekts zu liefern.

- (NSString*)description 
{ 
    return [NSString stringWithFormat:@"%@, %@; %@", a, b, c]; 
} 

Ich glaube, dass von Hillegass 'Buch vorgeschlagen.

+0

Danke, für die Hillegass-Erinnerung auch;) – mvexel

7

Ich überschreibe description in praktisch allen Unterklassen, die ich erstelle. Ich schätze, wie Tom Duckering in seinem Kommentar schreibt, dass Ihr Zitat nur für verwaltete Objekte gilt.

- (NSString *)description 
{ 
    return [NSString stringWithFormat:@"%@ <%p>", NSStringFromClass([self class]), self]; 
} 
2

Sie können auch [NSObject debugDescription] überschreiben, das vom Debugger aufgerufen wird. Es wird so genannt, wenn Sie im Debugger "print to console" verwenden. Sie können es auch direkt in einem NSLog aufrufen.

Standardmäßig ruft debugDescription in den meisten Klassen nur description auf, aber Sie können sie separate Strings zurückgeben. Es ist ein guter Ort, um die Ausgabe mit Details zu laden.

Kategorien sind ein guter Ort, um die Methode für Ihre benutzerdefinierten Klassen und vorhandene Klassen zu parken. Dies ist besonders nützlich, da Sie die Kategorie in einen Debug-Build einschließen, aber in der Version ausschließen können. Wenn die Kategorie nicht vorhanden ist, ruft der Code stattdessen die Standardklassenmethode auf.

Ich habe eine Debugging-Kategorie für UIView, die alle Attribute ausgibt, die mir einfallen. Wenn ich einen scheußlichen Bug bekomme, füge ich einfach die Kategorie ein und dann kann ich alles über jede Ansicht direkt in der Debugger-Konsole sehen.

4

Um Ihre Frage aus der anderen Richtung zu beantworten, ist stringValue etwas ganz anderes - es beschreibt nicht den Empfänger, es ist eine Eigenschaft davon. Ihre benutzerdefinierte description kann sogar die stringValue, oder einen Auszug davon, wenn es lang ist.

Ein wichtiger Unterschied ist, dass stringValue oft eine veränderbare Eigenschaft ist (siehe zum Beispiel die von NSControl), während description immer eine unveränderliche Eigenschaft ist, berechnet auf Anfrage.