2010-12-02 16 views
5

Mit meinen eigenen Klassen überschreibe ich normalerweise die Beschreibungsmethode - (NSString *), um das Debuggen zu erleichtern. Wenn ich jedoch eine Beschreibung für eine von mir implementierte Klasse aufruft, die rekursiv die description-Methode von meinen anderen Klassen aufruft, werden alle Formatierungszeichen aus den 'tieferen' Klassen maskiert. Das macht jedes hübsche Drucken schwierig zu implementieren. Hier ist ein Beispiel, um zu verdeutlichen:Korrekte Implementierung der NSObject-Beschreibungsmethode für verschachtelte Klassen mit Sammlungen

@interface Foo { 
    NSArray *barsArray; 
} 
@end 
@implementation Foo 
- (NSString *)description { 
    return [NSString stringWithFormat: @"foo contents: %@", barsArray]; 
} 

@interface Bar { 
    NSString *s1; 
    NSString *s2; 
} 
@implementation Bar 
- (NSString *)description { 
    return [NSString stringWithFormat: @"s1: %@\ns2: %@", s1, s2]; 
} 

In diesem Fall werden die \ n Zeilenumbrüche aus der Beschreibung der Klasse B in der Ausgabe der Klasse A Beschreibung Verfahren entkommen lassen. Irgendeine Idee, wie man dieses Verhalten loswerden oder umgehen kann? Es ist besonders ärgerlich, wenn verschachtelte Klassen gedruckt werden, die alle Sammlungen enthalten.

+0

Wenn ich Ihre Implementierung nehme, barsArray eine Bar *, und dann print-Objekt auf einem Foo-Objekt aufrufen, wird die Newline korrekt gedruckt, nicht maskiert. Wo genau ist dein Problem? –

+0

Wenn Sie anstelle eines Arrays von Bar ein einzelnes Bar * -Element haben, mit dem Sie Recht haben, wird alles korrekt gedruckt. Allerdings mit dem Array scheint es, dass die Beschreibung Methode für Array, entkommt die Zeichenfolgen, die von aufrufenden Beschreibung für Array-Elemente zurückgegeben werden – maciejs

Antwort

2

Sie können immer die schöne Formatierung verwenden, die die Standardbehälter mit sich bringen. Zum Beispiel könnte Ihre Bar Beschreibung sein:

- (NSString *)description { 
    NSArray *desc = [barsArray valueForKey:@"containerDescription"]; 
    NSDictionary *descriptionDictionary = 
    [NSDictionary dictionaryWithObjectsAndKeys:desc, @"foo contents", nil]; 
    return [descriptionDictionary description]; 
} 

Die Lösung ist nicht optimal natürlich, wie Sie eine zweite Methode haben, und haben:

- (id)containerDescription { 
    return [NSDictionary dictionaryWithObjectsAndKeys:s1, @"s1", s2, @"s2", nil]; 
} 

- (NSString *)description { 
    return [self.containerDescription description]; 

Sie nun folgende auf Foo tun können um die containerDescription auf höheren Ebenen aufzurufen, aber es ist die einzige, die ich bisher gefunden habe.

+0

nein, das funktioniert nicht. Es hat genau das gleiche Problem wie oben beschrieben - und das liegt daran, dass die Beschreibungsmethode für das Array die Ausgabe zu verlassen scheint, die von Beschreibungsmethoden zurückgegeben wird, die für Array-Elemente aufgerufen werden. Mit Ihrem speziellen Code und der Annahme, dass wir s1 = @ "s1 string" und s2 = @ "s2 string" initiieren, erhalten wir: foo contents: ( "{\ n s1 = \" s1 string \ "; \ n s2 = \ "s2 string \"; \ n} ", " {\ n s1 = \ "s1 string \"; \ n s2 = \ "s2 string \"; \ n} " ) Genau mit Diese nervigen Charaktere wollten ich zuerst loswerden. – maciejs

+0

Ah, danke, dass du es aufräumst, natürlich. Ich habe den Code jetzt auf etwas aktualisiert, das mit dem Array von Balken funktioniert. –

+0

Ja, das Problem ist, dass wenn deine Hierarchie viel tiefer ist, es irgendwie langweilig wird. Die andere Lösung, die ich gefunden habe, war, die Beschreibungszeichenfolge auf der obersten Ebene zu entblößen. Aber das ist ein ziemlich grober Hack. – maciejs

0

Sie können einen Wagenrücklauf \r verwenden, der auch in einer neuen Zeile enden wird (sogar in einer Beschreibung von NSArray).
Aber es wird nicht die Ausgabe einrücken. In meinem Fall habe ich gerade 8 Leerzeichen hinzugefügt (\t wird auch maskiert), die schön für Plain und Array-Ausgabe aussehen, aber nicht so schön wie es für tiefere Strukturen sein könnte.

Verwandte Themen