iPhone sdk: Je suis en train d'augmenter un entier de 10 et de ne pas
-
12-09-2019 - |
Question
(problème résolu maintenant, voir les réponses ci-dessous)
Bonjour, dans mon application, je suis en train de créer un compteur de points. Cela augmente un nombre de 10 à chaque fois qu'un bouton est enfoncé.
Je réussi à obtenir mon application pour augmenter une valeur (0) par 1 chaque fois qu'un bouton est pressé, et de se rappeler la dernière valeur et afficher la prochaine fois que le démarrage de l'application. Mais lorsque vous appuyez sur le bouton qui est supposé augmenter la valeur des points par 1 après l'application redémarre le nombre commence à augmenter de 0 pas la valeur mémorisée.
Comment puis-je obtenir les points pour augmenter de 10 et rappelez-vous la dernière valeur et l'affichage (et compter de celui-ci) après l'application est sorti et a commencé à nouveau?
Voici mon code actuel:
Code pour le bouton pour augmenter la valeur de 1:
- (IBAction)startClick:(id)sender{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setInteger:count forKey:@"greeting"];
NSString *numValue = [[NSString alloc] initWithFormat:@"%d", count++];
counter.text = numValue;
Méthode de viewDidLoad:
- (void)viewDidLoad {
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *greetName = [prefs stringForKey:@"greeting"];
NSInteger count = [prefs integerForKey:@"greeting"];
counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
if(count == 0) {
counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
} else {
counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
}
La solution
Il y a deux choses qui se passent ici. Tout d'abord, vous enregistrez le nombre avant que vous incrémenter. Cela signifie que même si l'économie se passait, il serait un plus faible que prévu.
Le bug réel que vous voyez est bien que vous éludant comte. Si vous regardez, vous remarquerez que vous avez la ligne suivante dans viewDidLoad:
NSInteger count = [prefs integerForKey:@"greeting"];
malgré le fait que se référer directement à compter en startClick :. Je présume que vous avez également un compte nommé Ivar et que ce qui se passe est vous dire pour définir le Ivar, mais vous êtes en fait le réglage de la variable locale. Le Ivar sera réglé sur 0 par défaut lorsque la classe est ventilés entre, ce qui est la raison pour laquelle il semble toujours être remis à zéro. Vous pouvez le réparer en changeant que, comme à:
count = [prefs integerForKey: @ "message d'accueil"];
Il est également possible vos valeurs ne sont pas synchronisées sur le disque si vous s'écraser lors de l'application quitter, mais à moins que vous voyez des collisions dans le journal d'exécution qui ne devrait pas être un problème. Vous pouvez explicitement synchronisez la valeur si elle est importante.
Vous compilez ce code avec des avertissements sous tension? Essayez-vous de corriger ces mises en garde? Si vous avez des avertissements sous tension, vous devriez voir quelque chose comme « déclaration locale de « count » cache variable d'instance »
Autres conseils
Dans la méthode startClick:
, vous semblez stocker l'entier count
dans les paramètres utilisateur par défaut avant qu'il ait été incrémentée. Si vous voulez augmenter par 10, puis changer la méthode:
- (IBAction)startClick:(id)sender {
//Increase count by 10
count+=10;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setInteger:count forKey:@"greeting"];
NSString *numValue = [[NSString alloc] initWithFormat:@"%d", count];
counter.text = numValue;
}
En outre, pourquoi avez-vous mis deux fois la propriété counter.text
:
counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
if(count == 0) {
counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
} else {
counter.text = [[NSString alloc] initWithFormat:@"%@",greetName];
}
Il peut également être utile pour vous d'utiliser stringWithFormat
au lieu d'allouer un NSString
et appelant initWithFormat
, car au moment où il fuit la mémoire parce que vous ne relâchez pas; si vous appelez stringWithFormat
, elle retourne un objet autoreleased, qui sera conservé lorsque counter.text
est réglé (car il est un raccourci pour la méthode setter) vous aurez donc pas de problèmes de mémoire. Vous pouvez changer la ligne à:
counter.text = [NSString stringWithFormat:@"%d",count];
Ce qui vous délivrerai de récupérer la valeur du compteur en tant que chaîne des valeurs par défaut de l'utilisateur.