2012-08-16 21 views
11

puse un punto de ruptura ...¿Cómo puedo obtener el valor/claves de los objetos NSDictionary en la consola del depurador?

si lo hago:

(lldb) print [self dictionary] 
(NSDictionary *) $5 = 0x0945c760 1 key/value pair 

pero si lo hago:

(lldb) print [[self dictionary] allKeys] 
error: no known method '-allKeys'; cast the message send to the method's return type 
error: 1 errors parsing expression 

Incluso si intento acceder a la clave que sé que está ahí ..

(lldb) print [[self dictionary] objectForKey:@"foobar"] 
error: no known method '-objectForKey:'; cast the message send to the method's return  type 
error: 1 errors parsing expression 

¿Qué estoy haciendo mal?

+1

Lo primero que haces mal es etiquetar esta pregunta como 'xcode'. –

+0

'po [self dictionary]' – Joe

Respuesta

14

¿Habla usted inglés? - Parece que lo haces, bastante bien! Y ah, qué coincidencia, el depurador también lo hace!

Muy bien, hemos terminado con la parte difícil. Así que ahora que se entienden entre sí con el depurador, vamos a ver lo que sugiere:

error: no known method '-objectForKey:'; cast the message send to the method's return type 

Por lo tanto, se dice que no se puede deducir de la información del tipo de retorno simplemente del nombre del Enviar mensaje - y que está perfectamente bien (uno no usa la notación húngara, ¿verdad?). Y hasta te dice cómo exactamente tienes que resolver ese problema: tienes que emitir enviar el mensaje a el tipo de devolución del método.

Al encender los documentos de Apple, encontramos que - [NSDictionary objectForKey:] devuelve - el tipo de objeto Objective-C genérico. La conversión a Identificación (o mejor aún, si usted sabe qué tipos de objetos su diccionario mantiene, el lanzamiento de ese tipo de objeto exacto) hace el truco:

(lldb) print (MyObject *)[(NSDictionary *)[self dictionary] objectForKey:@"foobar"] 
+1

¡Agradezco a su inteligente yo! :) Dejaré otro ejemplo de este problema: ** Fall: ** 'print [[[self.collectionView gestureRecognizers] objectAtIndex: 0] isKindOfClass: [UITAPGestureRecognizer class]] ' ** Bueno: **' print (BOOL) [[[self.collectionView gestureRecognizers] objectAtIndex: 0] isKindOfClass: (Class) [UITAPGestureRecognizer class]] ' Tenga en cuenta los 2 moldes necesarios para que funcione. – Jeff

+0

Deje que Objective C saque lo simple de lo estúpidamente simple. –

3

¿Por qué no lo hacen

NSLog(@"dict: %@", dictionary); 

o

NSLog(@"dict objectForKey:foobar = %@", [dictionary objectForKey:@"foobar"]); 
+0

Creo que está tratando de obtener la información de la consola, no del código fuente. Sin embargo, es la mejor manera de hacerlo, en mi opinión. –

13

El comando de impresión LLDB espera que el valor que se desea imprimir es un no-objeto. El comando que deberías usar para imprimir objetos es po.

Cuando le dice a lldb que imprima el valor, busca un método llamado allKeys que devuelve un objeto no válido y falla. Pruebe en su lugar el siguiente comando ...

po [[self dictionary] allKeys] 
3

Para imprimir la description del objeto en GDB o LLDB que necesita para usar print-object o po.

(lldb) po [self dictionary] 
(lldb) po [[self dictionary] objectForKey:@"foobar"] 
0

Parece que hay un error en LLDB en el momento que causa po dictionary[@"key"] para imprimir una línea en blanco en lugar del valor de la clave. Use [dictionary[@"key"] description] para obtener el valor en su lugar.

Cuestiones relacionadas