2013-08-06 12 views
8

I überschreiben Objekt -(NSString*)description aber Xcode immer error: summary string parsing error in Übersichtsfeld in Variablen anzuzeigen.NSObject Beschreibung und benutzerdefinierte Zusammenfassungen in Xcode

Meine aktuelle Implementierung ist die folgende:

- (NSString*)description { 
    return [NSString stringWithFormat:@"<%@ %p> x=%f, y=%f", self.class, self, _x, _y]; 
} 

Wenn ich po objectName in Konsole eingeben, LLDB zeigt eine feine Ausgabe wie erwartet, aber Xcode und Befehl p objectName immer Fehler anzeigen, so etwas ist das richtige Debug-Beschreibungsformat zu Zusammenfassende Feldarbeit machen? Es lohnt sich zu beachten, dass die Ausgabe des Befehls "p" mit einer zusammenfassenden Nachricht übereinstimmt, die Sie in Xcode für Instanzen von Foundation-Klassen sehen.

Update:

Soweit ich aus "WWDC 2012 Sitzung Debuggen in Xcode", benutzerdefinierten Zusammenfassungen können nur benutzerdefinierte Python-Skript implementiert werden sehen können. -(NSString*)description oder -(NSString*)debugDescription Methoden sind ohnehin nicht mit Übersichtsnachrichten verbunden. Ich dachte, sie sind, weil ich einen Fehler angezeigt bekommen habe, aber es scheint, dass es eine Standardnachricht für Klassen ist, die ihre eigenen Formatierer nicht haben.

+0

Sie sagen "überschreiben" - ist das eine Unterklasse oder eine Kategorie? Und was ist die Superklasse? –

+2

Und ich kann nicht sagen, dass Sie "p objectName" in Xcode tun. Im Xcode Debugger habe ich immer 'po' für ein Objekt gemacht. 'p' ist für Skalare. –

+0

Eine Sache zu beachten, Hot Licks, ist, dass "p ObjektName" wird für die meisten der Standard-Foundation-Objekte (Ihre NSStrings, Ihre NSArrays, etc.) funktionieren, da lldb integrierte Formatierer, die das Objekt zu formatieren wissen, ohne zu laufen Code in Ihrem Programm. Wie Andy in seinem Update bemerkt, können Sie auch eigene benutzerdefinierte Formatierer für Ihr eigenes Objekt in Python schreiben - es ist ziemlich einfach, sobald Sie den Dreh raus haben. –

Antwort

2

Ich würde vorschlagen, zumindest:

- (NSString*)description { 
    return [NSString stringWithFormat:@"%@; x=%f, y=%f", [super description], _x, _y]; 
} 

So, dass Sie nicht manuell den NSObject Standard replizieren und dadurch jegliche nicht-standardmäßige Verhalten Blockierung der Superklasse entschieden haben, kann einschließen.

Darüber hinaus ist "Zusammenfassung String Parsing Fehler" ein ILDB-Fehler. Es wird nur vom Debugger gemeldet. Per its documentation, po ist für Objective-C-Objekte korrekt; ist für C- oder C++ - Objekte. Sie müssen diesen Fehler also nicht beachten - er sagt Ihnen im Wesentlichen nur, dass Sie den falschen lldb-Befehl verwendet haben.

EDIT: für das, was es wert ist, verwendet das Verfahren durch CFArray ist open source und sieht aus wie:

static CFStringRef __CFArrayCopyDescription(CFTypeRef cf) { 
    CFArrayRef array = (CFArrayRef)cf; 
    CFMutableStringRef result; 
    const CFArrayCallBacks *cb; 
    CFAllocatorRef allocator; 
    CFIndex idx, cnt; 
    cnt = __CFArrayGetCount(array); 
    allocator = CFGetAllocator(array); 
    result = CFStringCreateMutable(allocator, 0); 
    switch (__CFArrayGetType(array)) { 
    case __kCFArrayImmutable: 
    CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = immutable, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : ""); 
    break; 
    case __kCFArrayDeque: 
    CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = mutable-small, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : ""); 
    break; 
    } 
    cb = __CFArrayGetCallBacks(array); 
    for (idx = 0; idx < cnt; idx++) { 
    CFStringRef desc = NULL; 
    const void *val = __CFArrayGetBucketAtIndex(array, idx)->_item; 
    if (NULL != cb->copyDescription) { 
     desc = (CFStringRef)INVOKE_CALLBACK1(cb->copyDescription, val); 
    } 
    if (NULL != desc) { 
     CFStringAppendFormat(result, NULL, CFSTR("\t%u : %@\n"), idx, desc); 
     CFRelease(desc); 
    } else { 
     CFStringAppendFormat(result, NULL, CFSTR("\t%u : <%p>\n"), idx, val); 
    } 
    } 
    CFStringAppend(result, CFSTR(")}")); 
    return result; 
} 

Wie bei den anderen Ausführungen oben, ich bin bereit zu spielen, dass die Antwort: Xcode Debugger isn ist in keinster Weise intelligent und definitiv nicht schlau genug, um die richtigen po Mittel zu verwenden, um eine Objective-C-Beschreibung zu erhalten; Wenn Ihr Objekt ein nicht-abgelenktes Objective-C-Objekt ist, wird der Debugger es nicht herausfinden können.

+0

Vielen Dank für den Vorschlag. Ich wollte nur einen netten Hinweis wie den von NSArray haben, er zeigt die Anzahl der Elemente im Array an. – Andy

+0

... und du willst nicht 'po' eingeben müssen? Wenn es einen Unterschied gibt, dann ist es bei einer Vermutung, dass "NSArray" gebührenfrei überbrückt ist und daher nicht nur ein Objective-C-Objekt ist, sondern auch mindestens eine andere Art von Sache. – Tommy

+1

Tommy, es handelt sich um eine zusammenfassende Nachricht, die in der Xcode-Variablenansicht während des Debuggens angezeigt wird und die sehr hilfreich sein kann, so hilfreich, dass Sie nicht einmal etwas eingeben müssen. – Andy

Verwandte Themen