2015-11-02 2 views
0

J'ai un attribut qui est décrit comme Int16. Il est décrit dans le fichier .h comme NSNumber. Peu importe comment je le formate, je n'arrive pas à obtenir la valeur valide de 12 ou 24 stockée dans UserDefaults. Qu'est-ce que je fais mal? ou, mieux encore, comment puis-je résoudre ce problème aHourFormat est le même que timeFormat?Impossible de définir 'int' dans CoreData comme numéro NS

Voici le code:

updateData.aHourFormat = [NSNumber numberWithInt:[preferencesDict objectForKey:@"timeFormat"]]; 
NSLog(@"\ntimeFormat: %d\naHourFormat: %d",[[preferencesDict objectForKey:@"timeFormat"]intValue],[updateData.aHourFormat intValue]); 

Ce qui NSLog affiche dans la console de débogage:

timeFormat: 12 
aHourFormat: -30496 

et

timeFormat: 24 
aHourFormat: 14000 

Telle est la définition de aHourFormat:

@property (nonatomic, retain) NSNumber *aHourFormat; 
+0

'Int16' est 'court',' Int32' est' int' – vadian

Répondre

1

Change:

updateData.aHourFormat = [NSNumber numberWithInt:[preferencesDict objectForKey:@"timeFormat"]]; 

Pour:

updateData.aHourFormat = [preferencesDict objectForKey:@"timeFormat"]; 

objectForKey: retourne un objet. Si vous le lancez dans un NSInteger, vous obtiendrez une valeur liée à son adresse; Si vous l'empaquetez ensuite dans un NSNumber, alors c'est ce que vous obtiendrez lorsque vous déballez plus tard comme intValue.

Vous voulez juste l'objet directement.

Vous obtiendrez autrement un résultat fiable à cause d'une chose appelée tagged pointers, qui concerne la façon dont les adresses de mémoire peuvent être utilisées pour qu'il n'y ait vraiment rien en mémoire sur les plates-formes 64 bits. Il ne vaut pas la peine de s'inquiéter d'autre que d'être conscient que le résultat fiable n'est pas surprenant.

+0

J'ai changé le code et cela a fonctionné une fois! les données dans PreferencesDict sont valides, mais quand j'essaye de mettre à jour * aHourFormat *, c'est zéro (0). des idées? – SpokaneDude

+0

Laissez-le dormir toute la nuit, et l'alto! ça marche tout le temps maintenant ... qui sait pourquoi! : D Merci encore ... – SpokaneDude