Come scaricare i dati archiviati nell'oggetto object-c (NSArray o NSDictionary)
-
08-07-2019 - |
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.
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
Spero che questo possa essere utile per qualcuno!