2013-08-06 4 views
8

sovrascrivo di -(NSString*)description oggetto tuttavia Xcode mostra sempre error: summary string parsing error nel campo Riassunto nella vista variabili.descrizione e personalizzati NSObject riassunti in Xcode

mio attuale implementazione è la seguente:

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

Se digito po objectName in console, LLDB mostra una multa di uscita come previsto, tuttavia Xcode e il comando p objectName indicano sempre l'errore, quindi qual è la corretta descrizione di debug formato far funzionare il campo sommario? Vale la pena notare che l'output del comando "p" è lo stesso di un messaggio di riepilogo che si vede in Xcode per le istanze delle classi Foundation.

Aggiornamento:

Per quanto posso vedere da "Debug sessione WWDC 2012 in Xcode", riepiloghi personalizzati possono essere realizzati utilizzando solo script python personalizzato. I metodi -(NSString*)description o -(NSString*)debugDescription non sono comunque collegati ai messaggi di riepilogo. Ho pensato che fossero perché ho visualizzato un errore, ma sembra che sia un messaggio standard per le classi che non hanno i propri formattatori.

+0

Tu dici "override" - è questa una sottoclasse o una categoria? E qual è la superclasse? –

+2

E non ti dico che tu faccia "p objectName" in Xcode. Nel debugger Xcode ho sempre fatto 'po' per un oggetto. 'p' è per gli scalari. –

+0

Una cosa da notare, Hot Licks, è che "p objectName" funzionerà per la maggior parte degli oggetti standard Foundation (i tuoi NSStrings, i tuoi NSArrays, ecc.) Perché lldb ha formattatori incorporati che sanno come formattare l'oggetto senza eseguire alcun codice nel tuo programma. Come osserva Andy nel suo aggiornamento, puoi anche scrivere i tuoi formattatori personalizzati per il tuo oggetto in Python - è piuttosto facile una volta capito. –

risposta

2

vorrei suggerire almeno:

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

Così che non si sta replicando manualmente il NSObject predefinito e bloccando così qualsiasi comportamento non predefinito superclasse potrebbe aver scelto di includere.

Oltre a ciò, "stringa di sintesi errore di analisi" è un errore lldb. Viene segnalato solo dal debugger. Per its documentation, po è corretto per gli oggetti Objective-C; p è per oggetti C o C++. Quindi non è necessario prestare attenzione a questo errore: in pratica ti sta solo dicendo che hai usato il comando lldb sbagliato.

EDIT: per quello che vale, il metodo usato da CFArray è open source e si presenta come:

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; 
} 

Come per le altre osservazioni di cui sopra, io sono disposto a scommettere che la risposta è: debugger ISN di Xcode 'intelligente in ogni senso e sicuramente non è abbastanza intelligente da usare il giusto mezzo po per ottenere una descrizione di Objective-C; se il tuo oggetto è un oggetto Objective-C non riflesso, allora il debugger non sarà in grado di capirlo.

+0

Grazie per il suggerimento. Volevo solo avere una sorta di suggerimento come quello che ha NSArray, mostra il numero di elementi nell'array. – Andy

+0

... e non vuoi dover digitare 'po'? Se c'è una differenza, allora, a supposizione, è che 'NSArray' è un ponte senza pedaggio e quindi non è solo un oggetto Objective-C ma almeno un altro tipo di cosa. – Tommy

+1

Tommy, si tratta di un messaggio di riepilogo che viene visualizzato nella vista delle variabili Xcode durante il debug e che può essere molto utile, così utile in modo da non dover nemmeno digitare nulla. – Andy