2014-05-03 11 views
9

Ich verwende [NSUserDefaults standardDefaults], um einen Boolean zu speichern, um zu sehen, ob es das erste Mal ist, dass die Anwendung gestartet wird ... Wenn ja, sollte die App ein Registrierungsfenster anzeigen.NSUserDefaults Werte werden regelmäßig verloren

  • Es funktionierte bis letzte Woche in Ordnung, aber jetzt, manchmal, wenn ich wechseln zu anderen Anwendungen und kommen zurück nach einer Weile, ich sehe, dass die Registrierung Seite geladen wird, während es nicht sollte.

  • benutzen ich NSLog zu sehen, was in [NSUserDefaults standardDefaults] gespeichert ist, und ich sehe, dass die Werte, die ich zu nil (null) gespeichert gesetzt worden, während ich, dass irgendwo in meinem Code nicht getan haben.

Weiß jemand, warum die Werte zurückgesetzt werden?

S.S: Eigentlich sind die Werte nicht dauerhaft verloren, denn wenn ich nichts auf der Anmeldeseite mache und stattdessen die App verlasse, wird es normal starten, wenn ich das nächste Mal die App betrete !!!

+0

Sind Sie sicher, dass Sie '[[NSUserDefaults standardUserDefaults] synchronisieren]' '? – Avt

+0

Ja, ich habe das genannt! Wie ich in meiner Frage beschrieben habe! Es funktionierte lange Zeit und es passiert nicht jedes Mal, also muss es synchronisiert werden! –

+0

Ihre Frage erwähnt nie den Synchronisierungsaufruf. Sind Sie sicher, dass Sie nach dem Ändern eines Standardwerts eine Synchronisierung aufrufen? –

Antwort

0

Stellen Sie sicher, dass Sie [[NSUserDefaults standardUserDefaults] synchronize] anrufen, nachdem Sie preferences eingestellt haben und Ihre Voreinstellungen nicht überschreiben.

+0

Ja, ich habe das aufgerufen! Wie ich in meiner Frage beschrieben habe! Es funktionierte lange Zeit und es passiert nicht jedes Mal, also muss es synchronisiert werden! –

+0

Und ich entferne den Schlüssel nirgendwo in meinem Code! –

1

Vor langer Zeit trat ich dieses Problem auf, stellt heraus, dass eine Drittanbieterbibliothek, die ich verwendete, den gleichen Schlüssel verwendet, wenn Werte auf NSUserDefaults gespeichert werden. Versuchen Sie, Ihr Projekt nach diesem Schlüssel zu suchen, vielleicht wird er von etwas anderem zurückgesetzt.

+0

Zuerst habe ich das getan. Fand keinen ähnlichen Schlüssel. Und nur um sicherzugehen, dass ich den Schlüssel geändert habe. Aber das gleiche Problem existiert. Auch wenn es eine Sache gibt, die diesen Schlüssel zurücksetzt, hat eine Sache keine Erklärung: Warum wird der Wert wieder auf den richtigen Wert zurückgesetzt, wenn ich ihn verlasse und neu starte? –

+0

Für mich war es der Fall, dass ich vor einiger Zeit einen Code eingegeben hatte und vergessen hatte, dass dieser Teil meine App-Standardeinstellungen löschte. – Tanzeel

1

Hier sind die Möglichkeiten, wie ich weiß, über Werte in NSUserDefaults, in der Reihenfolge der Wahrscheinlichkeit zu verlieren:

wurde
  1. Der Schlüssel nie an erster Stelle
  2. Ihre App löscht es später
  3. Die gespeicherte Anwendung gelöscht und neu installiert
  4. Eine weitere App überschreibt oder löscht den Schlüssel
  5. Telefon oder Simulator zurückgesetzt
  6. In der Nacht wird das Telefon durch ein identisches aussehende, verschiedenes Telefon

Es klingt wie aus der Diskussion hier ersetzt, dass man 1,2,4 ausgeschlossen hat, und wahrscheinlich 3 & 5. Der einzige nächste Debug-Schritt, den ich mir vorstellen kann, ist, das Test-Telefon zu jeder Zeit in einer gesperrten Schublade zu speichern.

Aber ich würde mein Geld auf ein intermittierendes Problem verlassen, das # 1 verursacht. Dafür benötigen wir einen Posted-Code, den wir untersuchen müssen.

EDIT -

Eine hohe% der NSUserDefaults Probleme hier geschrieben sind über das Speichern von BOOLs und andere skalare Typen. Es sieht so aus, als ob das OP weiß, wie es in NSNumbers verpackt wird, aber insbesondere BOOLS sind behaftet, weil es leicht ist, falsche y-Werte wie NO no und nil und instance zu verwechseln.

Werfen wir das auf die Liste für diese Frage auf # 2.5. Da würde wieder Code zur Bestätigung benötigt.

1

Wenn dies während des Testens geschieht, ist das normal. Die Tatsache, dass das Programm sogar diese Entscheidung trifft (sollte ich die Registrierungsseite zeigen?) Deutet darauf hin, dass die App gewaltsam beendet wurde und von vorne anfängt. Beim Testen kann dies dazu führen, dass die App-Sandbox gelöscht wird, wenn die App von Xcode neu geladen wird. Im echten Leben eines echten Benutzers wird dies jedoch nicht passieren (es sei denn, der Benutzer löscht die App vom Gerät).

+0

Haben Sie zufällig irgendwelche Links oder Quellen, die dies bestätigen, oder stammt das aus eigener Erfahrung? – cbh2000

+0

@ cbh2000 Ich glaube nicht, dass ich es in letzter Zeit gesehen habe. – matt

Verwandte Themen