2011-03-22 14 views
5

No entiendo por qué este contador NSInteger aumenta exactamente 4 veces el valor verdadero de las filas de la base de datos. Tal vez esto es estúpido, pero en realidad sólo no lo entiendo ...NSInteger cuenta por 4?

Gracias hasta ahora :)

NSInteger *i; 
i = 0; 

for (NSDictionary *teil in gText) { 

    //NSLog(@"%@", [teil valueForKey:@"Inhalt"]); 

    [databaseWrapper addEntry:[teil valueForKey:@"Inhalt"] withTyp:[teil valueForKey:@"Typ"] withParagraph:[teil valueForKey:@"Paragraph"]]; 

    i+=1; 
} 

NSLog(@"Number of rows created: %d", i); 

Respuesta

11

Debido a que i es un puntero y se está incrementando el valor del puntero que lo más probable es que sea en pasos de 4 (tamaño del puntero NSInteger). Simplemente elimine la referencia del puntero * y debería estar bien.

NSInteger i = 0; 

for (NSDictionary *teil in gText) { 

En teoría, PODRÍA hacerlo de la manera difícil.

NSInteger *i; 
*i = 0; 
for (NSDictionary *teil in gText) { 
... 
*i = *i + 1; 
... 

Desde: Foundation Data Types Reference

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
#endif 
+0

Ah, entonces NSInteger no es un Objeto regular como todos los demás NSS ... ¿es un tipo primitivo? – LaK

+0

Sí, en realidad es interesante porque es un tipodef de largo o int. Incluiré el recorte de la documentación. – Suroot

+0

Bueno, parece que 64 bits más intuitivo ... bien para mí, gracias :) – LaK

1

i no se declara como un NSInteger, es declarado como un puntero a un NSInteger.

Dado que NSInteger tiene 4 bytes, cuando agrega 1, el puntero aumenta en realidad por el tamaño de 1 NSInteger, o 4 bytes.

i = 0; 
... 
i += 1; //Actually adds 4, since sizeof(NSInteger) == 4 
... 
NSLog(@"%d", i); //Prints 4 

Esta confusión está surgiendo debido NSInteger no es un objeto, por lo que no es necesario declarar un puntero a ella. Cambiar su declaración a este para el comportamiento esperado:

NSInteger i = 0; 
+0

"i no se declara como un NSInteger, está declarada como una NSInteger." uhhh ... ¿wat? – JustSid

+0

@JustSid: Oh wow ... sí, eso no es lo que quise decir ... = P –