Domanda

Perdonami per una domanda potenzialmente stupida qui, ma in altri linguaggi di programmazione (scripting come PHP o Perl) è spesso facile scaricare tutto ciò che è contenuto in una variabile.

Ad esempio, in PHP ci sono le funzioni var_dump () o print_r () . Perl ha la classe Data :: Dumper CPAN, ecc. Ecc.

Esiste qualcosa del genere per Objective-C? In alcuni casi sarebbe molto conveniente riuscire a scaricare tutto in quel modo, invece di usare gdb per ispezionare ogni variabile.

È stato utile?

Soluzione

In Cocoa, non esiste alcuna "discarica" come print_r di PHP o repr di python poiché non esiste un formato testuale che " rappresenta " un oggetto come in quelle lingue. Se usi

NSLog(@"%@", myObj);

o

NSString *stringRep = [NSString stringWithFormat:@"%@",myObj];

o

NSString *stringRep = [myObj description];

otterrai (loggato alla console nel primo caso), il risultato di [descrizione myObj] , un metodo definito in NSObject allo scopo di stampare un < em> descrizione ( non una discarica) di un oggetto.

Se invochi po myObj in gdb, otterrai [myObj debugDescription] (spesso uguale a descrizione , ma non sempre).

Classi come NSArray e NSDictionary e NSData hanno la precedenza su description per stampare una descrizione ricorsiva piuttosto utile dei loro contenuti , ma il [NSObject description] predefinito stampa solo il valore del puntatore corrispondente all'istanza.

Se controlli il codice per i tipi in questione, puoi sovrascrivere i loro metodi description o debugDescription per restituire tutto ciò che desideri. In caso contrario, è possibile ignorare il metodo description o debugDescription utilizzando una categoria, oppure utilizzare una categoria per definire un myDebugDescription o alcuni di questi quindi invoca da gdb usando po [myObj myDebugDescription] .

Altri suggerimenti

puoi anche usare il comando gdb print object per visualizzare rapidamente un oggetto nel debugger:

po dictionary

Sarà sostanzialmente lo stesso di chiamare NSLog (...) dall'interno del tuo codice.

Utile anche quando si stampa NSData che contiene dati ASCII è:

p (char *) [data bytes]

Utilizzare NSLog () per scaricare il contenuto degli oggetti. Ad esempio:

NSData* myData = //... assume this exists
NSLog(@"Contents of myData: %@", myData);

NSLog ha una stringa di formato in stile printf (si aspetta un oggetto NSString) seguito da un elenco variabile di parametri, proprio come printf. Il carattere sostitutivo% @ rappresenta un oggetto il metodo di descrizione su un oggetto. Ciò è utile per scaricare la maggior parte degli oggetti Objective-C in Cocoa.

Se vuoi scaricare il contenuto di un oggetto usando gdb (ti vedo taggato con gdb), usa lo speciale " po " direttiva anziché stampa. Ad esempio:

gdb) po myData

farà scaricare gdb dall'oggetto myData. po è una scorciatoia per print-object.

Fai attenzione con la registrazione NSLog - > molto probabilmente non lo vuoi nel codice di produzione.

È possibile che si desideri utilizzare una funzione di registrazione alternativa che chiama NSLog quando il prodotto è in esecuzione in modalità debug.

Di solito vado con questo a " debug " Contenuti NSArray:

NSEnumerator *arrenum = [myarray objectEnumerator];
id cobj;     
while ( cobj = [arrenum nextObject] ) {
   NSLog(@"%@", cobj);
}

Il codice enumera tutti gli oggetti nel myarray NSArray, quindi esegue l'iterazione e stampa di ogni oggetto.

Spero che questo possa essere utile per qualcuno!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top