2008-11-14 12 views
45

Perdónenme por una pregunta potencialmente tonta aquí, pero en otros lenguajes de programación (scripting como PHP o Perl) a menudo es fácil volcar todo lo contenido en un variable. Por ejemplo, en PHP existen las funciones var_dump() o print_r(). Perl tiene la clase CPAN Data::Dumper, etc. etc.Cómo volcar los datos almacenados en el objeto object-c (NSArray o NSDictionary)

¿Hay algo como esto para Objective-C? Sería muy conveniente en algunos casos poder volcar todo de esa manera, en lugar de usar gdb para inspeccionar cada variable.

+0

Ver http://stackoverflow.com/questions/2299841/objective-c-introspection-reflection – neoneye

+0

práctico: '[recursiveDescription myview]' – Jonny

Respuesta

71

En Cocoa, no hay ningún "volcado" como print_r de PHP o python repr ya que no hay un formato de texto que "represente" un objeto como en esos idiomas. Si utiliza

NSLog(@"%@", myObj); 

o

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

o

NSString *stringRep = [myObj description]; 

obtendrá (conectado a la consola en el primer caso), el resultado de [myObj description], un método definido en NSObject de el propósito de imprimir una descripción (no un volcado) de un objeto.

Si invoca po myObj en gdb, obtiene [myObj debugDescription] (a menudo lo mismo que , pero no siempre).

Las clases como NSArray y NSDictionary y NSData anulación description para imprimir una descripción recursiva bastante útil de su contenido, pero por defecto [NSObject description] imprime sólo el valor del puntero correspondiente a la instancia.

Si controla el código para los tipos en cuestión, puede anular sus métodos description o debugDescription para devolver lo que desee. De lo contrario, puede anular el método description o debugDescription usando una categoría, o usar una categoría para definir un myDebugDescription o alguno que pueda invocar desde gdb usando po [myObj myDebugDescription].

+1

¡el método 'description' es justo lo que necesito! ¡Gracias por la información! :) – Manuel

+0

Siempre recibe un mensaje como este:

10

Utilice NSLog() para volcar el contenido de los objetos. Por ejemplo:

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

NSLog tiene una cadena de formato de estilo printf (espera un objeto NSString) seguido de una lista de variables de los parámetros, al igual que printf. El carácter de reemplazo% @ representa un objeto, el método de descripción en un objeto. Esto es útil para eliminar la mayoría de los objetos Objective-C en Cocoa.

Si desea volcar el contenido de un objeto usando gdb (veo que lo etiquetó con gdb), use la directiva especial "po" en lugar de imprimir. Por ejemplo:

gdb) po myData 

hará que gdb vacíe el objeto myData. po es un atajo para print-object.

+0

La representación con formato de cadena (utilizado por NSLog y [NSString stringWithFormat:] et al.) puede no ser un "vertedero" completo del objeto. Es el resultado del método de descripción del objeto. Dado que los objetos pueden anular esta descripción, puede variar los resultados de su uso. –

+0

Lo sé, por eso dije "Esto es útil para deshacer/la mayoría de los objetos Objective-C en Cocoa", pero es básicamente lo que el OP está pidiendo. –

16

también puede utilizar el comando objeto de impresión GDB para ver rápidamente un objeto en el depurador:

po dictionary 

Este será básicamente el mismo que llamar a NSLog (...) desde el código.

También es útil cuando se imprimen NSData que contiene datos ASCII es:

p (char *) [data bytes] 
+0

Esto solo imprime los primeros cientos de bytes. ¿Cómo puedo hacer que se impriman todas? –

4

tener cuidado con la tala NSLog -> es muy probable que no quiere que en el código de producción.

Es posible que desee utilizar una función de registro alternativa que llame a NSLog cuando su producto se esté ejecutando en modo de depuración.

+1

Este es un buen punto. Muchos de los nuevos programadores de Objective C no se dan cuenta de esto. Si piensas en NSLog como printf o std :: cout de ObjC, no deberías equivocarte demasiado (y escribir un macros DLog wrapper es trivial). – philsquared

+0

Puede usar NSLog tanto como desee. Todo lo que tiene que hacer es agregar estas líneas en su archivo .pch, para eliminar mágicamente todas las líneas NSLog de la versión: '#ifndef DEBUG'' #define NSLog (...) '' endif' ... [ver aquí ] (http://www.marekbell.com/update-stripping-nslog-output-for-xcode-release-builds/) – SpaceDog

3

usualy voy con esto a contenidos NSArray "depuración":

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

El código enumerará todos los objetos en el NSArray myarray, y luego recorrer e imprimir todos los objetos.

Espero que esto puede ser útil para alguien!

Cuestiones relacionadas