2009-10-06 13 views
7

Cuando intento imprimir un valor entero a la consola que se recupera de un NSManagedObject, muestra un valor de 6 u 8 dígitos (¿la ID del objeto?). Sin embargo, si uso el depurador 'Print Description to Console' se muestra como el valor de un solo dígito que espero.Cómo imprimir un valor NSInteger desde un NSManagedObject utilizando NSLog

Por ejemplo, asignar el objeto 'secuencia' a un NSInteger y luego mostrar el uso de un formato de cadena NSLog:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue]; 
NSLog(@"sequence = %d",myProcess.sequence); 

salida de la consola es:

2009-10-06 16:11:05.871 MyProcess[33185:20b] sequence = 565256 

Pero cuando intento 'Imprimir a la consola' desde el depurador, veo el valor 1:

<MyStoryImage: 0x3f59a80> (entity: MyObject; id: 0x3f2d540 <x-coredata://FF21959A- 4B67-4587-A25F-66A7B8139DFA/MyProcess/p2> ; data: { 
sequence = 1; 
<x-coredata://FF21959A-4B67-4587-A25F-66A7B8139DFA/MyProcess/p1>; 
}) 

Su ayuda se agradece!

Respuesta

11

Lo que obtienes de tu NSManagedObject sería un NSNumber, creo. Es fácil de imprimir que:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSLog(@"sequence = %@", myProcess.sequence); 

o, si realmente necesita el NSInteger:

MyProcess *myProcess = [array objectAtIndex:i]; 
NSLog(@"sequence = %i", [myProcess.sequence integerValue]); 

creo que en este trozo de código

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)myProcess.sequence] intValue]; 

la (NSInteger) myProcess .secuencia realmente obtiene la dirección de memoria del NSNumber. No se puede simplemente lanzar un NSNumber en un NSInteger.

+0

Gracias! esto (junto con la explicación de Chuck's de% @ arriba) me dice lo que estaba haciendo mal y cómo solucionarlo. – dfdumaresq

-1

NSInteger es sólo un int:

typedef int NSInteger; 

En su primera línea de código:

NSInteger sequence = [[NSNumber numberWithInteger:(NSInteger)sequence] intValue]; 

Todo lo que está haciendo es la asignación de secuencia a sí mismo, en una manera indirecta. Y dado que no está inicializado, podría ser cualquier número aleatorio.

+0

NSInteger no es siempre un int. En aplicaciones de 64 bits, es un largo. –

+0

Lo siento, el ejemplo original fue defectuoso. He dejado en claro (er) que la secuencia es una propiedad de un MyProcess. – dfdumaresq

0

Dependiendo de cómo se construya la aplicación, NSInteger podría ser de 32 bits, o podría ser de 64 bits. Si se trata de un valor de 64 bits, tendrá que hacer

NSLog(@"sequence = %qi", sequence) 

para que trate correctamente sequence como un valor de 64 bits. Tenga en cuenta, sin embargo, que esto no funcionará para aplicaciones de 32 bits; por lo que sé, no hay un único especificador de formato que funcione para imprimir un NSInteger en mundos de 32 bits y de 64 bits.

1

Parece que myProcess.sequence es un NSNumber (objeto) en lugar de un NSInteger (escalar). Eso explicaría por qué se muestra correctamente en la descripción de un objeto, pero no cuando intenta explícitamente imprimirlo como un número entero.

+0

Sí, es un NSNumber (según lo declarado por CoreData), y supongo que eso responde mi pregunta ...Estaba confundido porque las propiedades de NSString se pueden imprimir sin ningún problema, pero quizás haya algún trabajo adicional realizado por el formateador de cadenas ("% @"). ¡Gracias! – dfdumaresq

+0

El especificador '% @' indica un objeto: cualquier objeto. También puede imprimir un NSNumber de esa manera. Por ejemplo, 'NSLog (@"% @,% @,% @! ", [NSNumber numberWithInt: 1], [NSNumber numberWithInt: 2], [NSNumber numberWithInt: 3])' registrará "1, 2, 3! ". Funciona llamando al método 'description' del objeto. El especificador '% d' es para ints. – Chuck

+0

¡Gracias por esto! – dfdumaresq

-1

Prueba esto:

NSLog(@"sequence = %li",(unsigned long)myProcess.sequence); 
+2

Por favor, mejore su respuesta con alguna explicación, especialmente en comparación con otras respuestas que ya se dieron – SBH

Cuestiones relacionadas