2010-06-22 8 views
1

J'essaie de récupérer une valeur de mon fichier de préférences qui est un entier. La chose amusante est que cela renvoie toujours zéro, bien qu'il existe et les noms pour les deux integerForKey: et setIntegerForKey: sont les mêmes.integerForKey: retourne toujours zéro

Voici comment je récupère la valeur: [defaults integerForKey:@"BackUpSize"];

Et ici je l'ai mis: [defaults setInteger:[sizeSlider doubleValue]*8589934592 forKey:@"BackUpSize"];

Je suis abasourdi. Ca devrait marcher ... ou est-ce qu'il me manque quelque chose ici?

Merci

Edit: par défaut est créé en tant que tel: NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];

Edit: Je l'ai essayé de créer ma propre méthode NSUserDefaults pour cette question, mais il revient toujours à zéro.

-(void)setDouble:(double)dou forKey:(id)key 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:dou] forKey:key]; 
} 
-(double)doubleForKey:(id)key 
{ 
    return [[[NSUserDefaults standardUserDefaults] objectForKey:key] doubleValue]; 
} 
+1

Avez-vous vérifié que 'defaults' n'est pas' nil'? Les appels de méthode sur le retour 'nil' ...' 0'. –

+1

par défaut est juste [NSUserDefaults standardUserDefaults] ... – Pripyat

+1

vient de le vérifier et ce n'est pas nul. – Pripyat

Répondre

3

8589934592 est un littéral codé en dur? Vraiment? Vous devriez au moins mettre quelque chose comme 1 << 33. Même alors, déclarez-le comme une constante, pour pleurer à haute voix.

Si vous construisez pour 32 bits, NSInteger est une valeur signée de 32 bits. Donc vous êtes plutôt susceptible de déborder. Je ne suis pas sûr de ce que le comportement de NSUserDefaults serait dans ce cas, mais il vaut la peine d'envisager.

+3

Je suis impressionné que vous l'ayez reconnu comme 1 << 33 à vue. ☺ –

0

Vous passez un double dans quelque chose qui attend un nombre entier. Normalement, vous vous attendez à une troncature et à un int, mais vous ne pouvez pas garantir que la méthode setInteger:forKey: le fait pour vous. Pourquoi multipliez-vous la valeur de votre curseur par ce nombre arbitrairement arbitraire?

Edit:

Pour expliquer ma réponse un peu plus:

Pour mémoriser des numéros dans les paramètres par défaut, ils doivent être enveloppés dans NSNumber objets. setInteger:forKey, et al, sont des méthodes de commodité qui prennent probablement votre entier et en créent un NSNnumber, en utilisant numberWithInt:. Je ne peux pas être sûr à 100% parce que je n'ai pas vu le code d'Apple, mais je suppose que passer un double à numberWithInt: reviendra à zéro car un double n'est pas un int.

+1

la raison pour laquelle je multiplie c'est parce que le curseur doit définir combien d'espace mon application peut utiliser, ce qui est défini en octets dans mon cas, mais j'en ai besoin en Go 1 byte fois 8589934592 équivaut à 1 Go. Ensuite, je compare la taille du dossier (qui est également en octets, donc j'ai besoin de le multiplier à nouveau) avec le curseur un pour voir si la limite a été atteinte ou non. Que devrais-je utiliser à la place de setIntegerForKey? utilisez simplement setObjectForKey? – Pripyat

+1

objectForKey ne fonctionnera pas ... – Pripyat

+1

Je suggère de créer un objet 'NSNumber' de votre valeur double finale, en utilisant' numberWithDouble: ', puis en utilisant' setObject: forKey'. – Jasarien

1

Une autre cause fréquente de ce type de problème est l'utilisation de setters personnalisés qui stockent les valeurs aux valeurs par défaut de l'utilisateur. Si vous faites cela, et si vous ne faites pas attention à accéder uniquement aux ivars dans votre code utilisateur par défaut, vous courez le risque de piétiner les préférences stockées pendant que vous les lisez.

Questions connexes