web-dev-qa-db-fra.com

Pourquoi NSUserDefaults n'enregistre-t-il pas mes valeurs?

Salut, j'essaie d'utiliser NSUserDefaults pour enregistrer certaines valeurs par défaut dans la base de données. Je suis capable d'enregistrer les valeurs dans le NSUserDefaults (même vérifié dans NSLog). Maintenant, j'ai besoin des valeurs dans le délégué d'application lorsque l'application est redémarrée. Mais je ne reçois rien dans le NSUserDefaults. Voici mon code de ma classe où j'enregistre les valeurs dans NSUserDefaults:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

            [prefs setObject:appDel.dictProfile forKey:@"dict"];
            NSLog(@"%@",[prefs valueForKey:@"dict"]);

Voici mon code d'App Delegagte:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

NSLog(@"%@",[prefs valueForKey:@"dict"]);

le code ci-dessus me renvoie toujours null. Quelqu'un peut-il m'aider?

52
pankaj

Si vous fermez votre application en appuyant sur le bouton d'accueil (dans le simulateur ou sur l'appareil), votre NSUserDefaults sera enregistré.

Si vous fermez votre application en appuyant sur "Arrêter" dans Xcode (dans le simulateur ou sur l'appareil), votre NSUserDefaultspourrait être enregistré, mais il y a de fortes chances qu'ils ne le fassent pas. NSUserDefaults persiste périodiquement toutes les modifications et si vous terminez le processus avant qu'elles ne soient persistées, elles disparaîtront. Vous pouvez forcer la sauvegarde en appelant:

[[NSUserDefaults standardUserDefaults] synchronize];



Addenda:

Dans iOS4 (cette réponse a été écrite à l'origine lorsque iOS3 était la version publique), votre NSUserDefaults peut ne pas être enregistré lorsque vous appuyez sur le bouton d'accueil. Appeler manuellement [[NSUserDefaults standardUserDefaults] synchronize] dans applicationDidEnterBackground: devrait vous assurer que vos NSUserDefaults sont correctement enregistrés (cela devrait vraiment être un comportement IMO intégré).

204
Nick Forge

Ce code fonctionne bien pour moi.

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

if (standardUserDefaults) {
    [standardUserDefaults setObject:myString forKey:@"Prefs"];
    [standardUserDefaults synchronize];
}
11
Kannan Prasad

Vous n'avez pas dit si vous exécutez sur un appareil ou dans le simulateur, mais si vous redémarrez l'application dans le simulateur, toutes les préférences seront réinitialisées entre les lancements si vous lancez à partir de Xcode. Les préférences ne seront conservées que si vous relancez à partir du simulateur lui-même.

2
Claus Broch

Dans mon cas, je sauvegardais et récupérais une chaîne. Lorsque j'ai synchronisé après l'enregistrement et que je suis revenu sur un autre thread, cela ne fonctionnait pas correctement. Le problème a été résolu en synchronisant à la fois après l'enregistrement et avant la récupération.

1
juan Isaza