10
votes

Les valeurs NSUserDefaults sont perdues périodiquement

J'utilise [nsuserdefaults standarddefaults] pour stocker un booléen pour voir si c'est la première fois que cette application est lancée ... Si tel est le cas, l'application doit afficher une fenêtre d'enregistrement.

  • Cela fonctionnait bien jusqu'à la semaine dernière, mais maintenant, parfois lorsque je passe à d'autres applications et revenez après un petit moment, je vois que cette page d'enregistrement se charge pendant qu'elle ne devrait pas.

  • i utilisé nslog Pour voir ce qui est stocké dans [nsuserdefaults standarddefault] et je vois que les valeurs que j'ai stockées ont été définies sur nil ( null) pendant que je ne l'ai pas fait ça nulle part dans mon code.

    Est-ce que quelqu'un sait pourquoi les valeurs sont réinitialisées?

    PS: En réalité, les valeurs ne sont pas perdues de manière permanente, car si je ne fais rien dans la page d'enregistrement et quitte l'application, il lancera normalement la prochaine fois que je saisi l'application !! !


4 commentaires

Êtes-vous sûr que vous avez appelé [[NSUserDefault StandardUserDefault] Synchroniser] ?


Ouais, j'ai appelé ça! Comme je l'ai décrit dans ma question! Cela fonctionnait bien pendant longtemps et cela n'arrive pas à chaque fois, il doit donc être synchronisé!


Votre question ne mentionne jamais l'appel de synchronisation. Êtes-vous positif que vous appelez Synchroniser après avoir changé une valeur par défaut?


Ouais, j'appelle synchroniser à chaque fois que je change une valeur dans standarduerdefault


4 Réponses :


0
votes

Assurez-vous que vous appelez [[NSUserDefaults StandardUserDefaultS] Synchroniser] Juste après la définition des préférences et que vous n'écracez pas vos préférences.


1 commentaires

Ouais, j'ai appelé ça! Comme je l'ai décrit dans ma question! Cela fonctionnait bien pendant longtemps et cela n'arrive pas à chaque fois, il doit donc être synchronisé!



1
votes

Il y a longtemps, j'ai rencontré cette question, il s'agit d'une bibliothèque tierce partie que j'utilisais utilise la même clé lors de la conservation des valeurs sur NSUserDefault . Essayez de rechercher votre projet pour cette clé, peut-être quelque chose d'autre est la réinitialisation.


2 commentaires

Tout d'abord, je l'ai fait. Trouvé aucune clé similaire. Et juste pour vous assurer que j'ai changé la clé. Mais le même problème existe. Même s'il y a une chose qui réinitialisait cette clé, une chose n'a aucune explication: pourquoi la valeur est restaurée à la bonne lorsque j'ai arrêté et relancer ???


Pour moi, c'était le cas que j'avais mis dans un code un certain retour et que j'avais oublié que cela effacera mes paramètres par défaut de l'application.



1
votes

Voici les moyens de perdre des valeurs dans NSUserDefaults , par ordre de vraisemblance:

  1. La clé n'a jamais été enregistrée en premier lieu
  2. Votre application le supprime plus tard sur
  3. L'application est supprimée et réinstallée
  4. Une autre application écrase ou supprime la clé
  5. Le téléphone ou le simulateur est réinitialisé
  6. Pendant la nuit, le téléphone est remplacé par un téléphone identique, différent,

    On dirait que, de la discussion ici, que vous avez exclu 1,2,4, et probablement 3 et 5. Le seul prochain étape de débogage, je peux penser à stocker le téléphone de test dans un tiroir verrouillé à Toutes les heures.

    Mais je laisserais mon argent sur un problème intermittent causant n ° 1. Pour cela, nous aurions besoin de code posté pour enquêter.

    edit -

    Un% élevé de Nsuserdefault Les problèmes postés ici portent sur la conservation des bools et d'autres types scalaires. On dirait que l'OP sait sur l'emballage dans les nsnumbers, mais les bools en particulier sont envahis car il est facile de confondre des valeurs fastes-y comme NO et NIL, et Nsnull instance.

    Jetons que sur la liste pour cette question à # 2.5. Là encore, aurait besoin de code pour confirmer.


0 commentaires

1
votes

Si cela se produit pendant le test, c'est normal. Le fait que le programme effectue même cette décision (dois-je montrer la page d'enregistrement?) Suggère que l'application a été arrêtée de force et commence à partir de zéro. Lors de l'essai, cela peut entraîner la suppression de l'application Sandbox lorsque l'application est rechargée de Xcode. Dans la vie réelle d'un véritable utilisateur, cependant, cela n'arrivera pas (à moins que l'utilisateur supprime l'application de l'appareil).


2 commentaires

Vous avez des liens ou des sources qui remontent à cela, ou est-ce une expérience personnelle?


@ CBH2000 Je ne pense pas que je l'ai vu arriver récemment.