Qual è l'equivalente Objective-C per “toString ()”, da utilizzare con NSLog?


170

Esiste un metodo che posso ignorare nelle mie classi personalizzate in modo da quando

      NSLog(@"%@", myObject) 

viene chiamato, stamperà i campi (o qualunque cosa ritenga importante) del mio oggetto? Immagino che sto cercando l'equivalente Objective-C di Java toString().

Risposte:


250

È il descriptionmetodo di istanza, dichiarato come:

- (NSString *)description

Ecco un esempio di implementazione (grazie a grahamparks):

- (NSString *)description {
   return [NSString stringWithFormat: @"Photo: Name=%@ Author=%@", name, author];
}

5
Nota se stai usando CoreData, la descriptionproprietà è riservata ... e fornirà utili informazioni di debug! In tal caso, dovrai trovare il tuo nome di metodo univoco.
Sitta,

È debugDescriptionanche riservato? Anche se penso che DebugDescriptiondovrebbe essere usato da un debugger come LLDB.
MaddTheSane,

36

Aggiungi questo al @implementationtuo corso di fotografia:

- (NSString *)description {
   return [NSString stringWithFormat:@"Photo: Name=%@ Author=%@",name,author];
}

24

È possibile ignorare il metodo di descrizione di NSObject:

- (NSString *)description

Per quanto riguarda la registrazione, consiglio questo post sul blog per una migliore registrazione in Objective-C.


4
Non è un metodo statico? Mi piacerebbe che questo operasse sugli oggetti piuttosto che sulla classe. Ad esempio, se ho una classe "Foto", con i campi "nome" e "autore", vorrei che NSLog stampasse quei campi così come sono assegnati nell'oggetto.
George Armhold,

2
Sì, ben individuato, ho premuto il tasto sbagliato. Dovrei chiaramente prestare maggiore attenzione quando leggo le mie risposte. Per fortuna qualcuno ha tenuto d'occhio la palla :-)
teabot

13

Esistono due funzioni che è possibile utilizzare.

- (NSString*)description

Questo verrà visualizzato quando metti il ​​tuo oggetto come, IE un parametro per NSLog. L'altra funzione di descrizione è:

- (NSString*)debugDescription

Questo verrà chiamato quando lo fai po anInstanceOfYourClassnella finestra di comando di debug. Se la tua classe non ha una debugDescriptionfunzione, allora descriptionverrà chiamata.

Si noti che la classe base è NSObjectstata descriptionimplementata, ma è piuttosto spoglia: mostra solo l'indirizzo dell'oggetto. Questo è il motivo per cui ti consiglio di implementare descriptionin qualsiasi classe da cui vuoi ottenere informazioni, specialmente se usi il descriptionmetodo nel tuo codice. Se lo usi descriptionnel tuo codice, ti suggerisco di implementare debugDescriptionanche, rendendo anche debugDescriptionpiù prolisso.


1

Questo produrrà le voci disponibili:

    NSLog((@"speechVoices:%", [[AVSpeechSynthesisVoice speechVoices] description] ));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.