2011-11-16 5 views
3

Je vais devenir fou avec ce bug! J'ai ce morceau de code qui fonctionne bien sur iOS 4,3iOS 5 NSNumber Bug

newRegistered.ticket_id = [NSNumber numberWithInt: 
[curRegistered objectForKey:@"ticket_id"] intValue]]; 

Si je fais:

NSLog(@"ID before : %d, ID after : %d", 
[curRegistered objectForKey:@"ticket_id"] intValue], [newRegistered.ticket_id intValue]); 

I Have sur iOS 4.3:

ID avant: 35459, ID après : 35459

Et sur iOS 5.0:

ID avant: 35459, ID après: -30077

S'il vous plaît aider! Merci d'avance.

## EDIT: ## J'ai étudié un peu plus le problème. Il semble que le problème vient de l'attribution d'un NSNumber dans CoreData. J'aurais dû spécifier que le morceau de code ci-dessus est utilisé avec CoreData (newRegistered est un NSManagedObject, et curRegistered est un NSDictionary contenant des données JSON (seulement des chaînes, jamais int ou long ...)).

Voici le problème spécifique:

long long test = 789654; 

Registereds *a = [NSEntityDescription insertNewObjectForEntityForName:@"Registereds" inManagedObjectContext:self.managedObjectContext]; 
a.ticket_id = [NSNumber numberWithLongLong:test]; 
NSLog(@"%lld -> %@", test, a.ticket_id); // Displays 789654 -> 3222 on iOS 5 and 789654 -> 789654 on iOS 4.3 

NSNumber *ticket_id = [NSNumber numberWithLongLong:test]; 
NSLog(@"%lld -> %@", test, ticket_id); // Displays 789654 -> 789654 

Il semble que le problème vient de l'objet Registereds (qui est un NSManagedObject, comme le newRegistered dans l'exemple précédent).

Avez-vous une idée pourquoi cela se produit? Je ne l'ai jamais vu quelque chose comme ça dans plus de 2 ans de codage, ce bug fait vraiment me pense que je ne sais pas comment le code ...

+0

Vous pouvez essayer d'utiliser '[NSNumber numberWithLong: ...' pour approfondir le problème. – dasdom

+0

Est-ce simulateur/appareil? – debleek63

+0

Vous devriez probablement imprimer la valeur "brute" de '[curRegistered objectForKey: @" ticket_id "]' pour voir s'il y a des caractères bizarres présents. –

Répondre

5

Un indice: 789654 tronqué à 16 bits est 3222.

J'ai essayé de reproduire votre problème avec iOS 5. La seule façon que je peux obtenir NSLog(@"%lld -> %@", test, a.ticket_id) pour afficher '789654 -> 3222' est si je mets le type d'attribut ticket_id à Integer 16. Si je le mets à Integer 32 ou Integer 64 alors la valeur attendue est affichée.

Vérifiez le type d'attribut ticket_id dans l'éditeur de modèle de données. Parce que vous utilisez long long je suppose qu'il devrait être réglé sur Integer 64. D'après ce que vous montrez, je suppose qu'il est réglé sur Integer 16. Sinon, la valeur est tronquée à 16 bits ailleurs.

+0

Merci beaucoup, c'était ça ... Je me demande encore pourquoi ça a marché sur iOS 4.3 ... On se dit qu'Int 16/32/64 n'a eu aucun effet ... – THClem

+0

iOS 5 est probablement plus strict à propos de l'application du type d'attribut en mémoire alors que 4.3 le laissait glisser. Je parie que même dans 4.3 lorsque les données sont réellement enregistrées dans la base de données Sqlite, il est tronqué. –