2009-12-14 13 views
5

Voglio avere una stringa descrittiva per un oggetto in Cocoa. Sto pensando di sovrascrivere il metodo description o il metodo stringValue. Quale è preferibile e perché? L'unica linea guida che ho trovato è in hereoverride description o stringValue nel cacao?

Si sconsiglia di ignorare la descrizione.

È questo che cosa suggeriresti? Qualunque altro punto di overrride preferito?

+1

Il collegamento è alla documentazione per i dati principali: si desidera sovrascrivere il metodo di descrizione per un oggetto NSManagedObject o qualcos'altro? –

+0

Non credo - è una sottoclasse NSObject che contiene i dati per un riquadro di delimitazione spaziale e alcune operazioni su questo. La descrizione della stringa è fondamentalmente una lista separata da virgola delle coordinate in basso a sinistra e in alto a destra. – mvexel

risposta

5

description è la strada da percorrere, è quello che si chiama per la fornitura di rappresentazione di stringa di un oggetto.

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

Credo che suggerito dal libro Hillegass' pure.

+0

grazie, anche per il promemoria Hillegass;) – mvexel

7

Io personalmente ignoro description in virtualmente tutte le sottoclassi create. Immagino, come Tom Duckering scrive nel suo commento, che la tua citazione si applica solo agli oggetti gestiti.

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

È anche possibile sovrascrivere [NSObject debugDescription] che viene chiamato dal debugger. È ciò che viene chiamato quando si usa "print to console" nel debugger. Puoi anche chiamarlo direttamente in un NSLog.

Per impostazione predefinita nella maggior parte delle classi debugDescription basta chiamare description ma è possibile farli restituire stringhe separate. È un buon posto per caricare l'output con i dettagli.

Le categorie sono un buon posto per parcheggiare il metodo sia per le classi personalizzate che per le classi esistenti. Ciò è particolarmente utile perché è possibile includere la categoria in una build di debug ma escluderla nella versione. Se la categoria non è presente, il codice chiama invece il metodo di classe predefinito.

Ho una categoria di debug per UIView che scarica tutti gli attributi che potrei pensare. Se colpisco un brutto bug, includo semplicemente la categoria e poi posso vedere tutto su ogni vista direttamente nella console del debugger.

4

Per rispondere alla tua domanda dall'altra direzione, stringValue è qualcosa di completamente diverso: non descrive il destinatario, ne è una proprietà. Il tuo numero personalizzato description potrebbe anche includere lo stringValue o un estratto di esso se è lungo.

Una differenza fondamentale è che stringValue è spesso una struttura mutevole (si veda, ad esempio, quella di NSControl), considerando che description è sempre una proprietà immutabile, calcolata su richiesta.

Problemi correlati