NSUserDefaults Werte werden regelmäßig verloren

9

Ich verwende [NSUserDefaults standardDefaults] , um einen booleschen Wert zu speichern, um zu sehen, ob es das erste Mal ist, dass die Anwendung gestartet wird ... Wenn ja, sollte die App ein Registrierungsfenster anzeigen.

  • Es funktionierte bis letzte Woche gut, aber jetzt, manchmal, wenn ich zu anderen Apps wechsle und nach einer Weile zurückkomme, sehe ich, dass die Registrierungsseite geladen wird, während sie nicht sollte.

  • Ich habe NSLog verwendet, um zu sehen, was in [NSUserDefaults standardDefaults] gespeichert ist, und ich sehe, dass die Werte, die ich gespeichert habe, auf nil (null) gesetzt wurden, während ich das nirgendwo in meinem Code getan habe.

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

PS: Tatsächlich sind die Werte nicht dauerhaft verloren, denn wenn ich nichts auf der Registrierungsseite mache und die App stattdessen verlasse, wird sie normal beim nächsten Aufruf der App starten !! !

    
Unkn0wn.Bit 03.05.2014, 11:42
quelle

4 Antworten

1

Vor langer Zeit bin ich auf dieses Problem gestoßen. Es stellte sich heraus, dass eine von mir verwendete Bibliothek von Drittanbietern den gleichen Schlüssel verwendet, wenn Werte in NSUserDefaults gespeichert werden. Versuchen Sie, Ihr Projekt nach diesem Schlüssel zu suchen, vielleicht wird er von etwas anderem zurückgesetzt.

    
Enrico Susatyo 03.05.2014 12:50
quelle
1

Hier sind die Möglichkeiten, die ich kenne, um Werte in NSUserDefaults in der Reihenfolge der Wahrscheinlichkeit zu verlieren:

  1. Der Schlüssel wurde nie gespeichert
  2. Ihre App löscht sie später
  3. Die App wurde gelöscht und neu installiert
  4. Eine andere App überschreibt oder entfernt den Schlüssel
  5. Das Telefon oder der Simulator wird zurückgesetzt
  6. Während der Nacht wird das Telefon durch ein identisch aussehendes, anderes Telefon ersetzt

Es klingt wie aus der Diskussion hier, dass Sie 1,2,4 und wahrscheinlich 3 & amp; 5. Der einzige nächste Debug-Schritt, den ich mir vorstellen kann, ist, das Testtelefon jederzeit in einer gesperrten Schublade zu speichern.

Aber ich würde mein Geld für ein zeitweiliges Problem hinterlassen, das # 1 verursacht. Dafür benötigen wir den geposteten Code, den wir untersuchen müssen.

BEARBEITEN -

Ein hoher Prozentsatz der NSUserDefaults Probleme, die hier gepostet werden, sind zum Speichern von BOOLs und anderen skalaren Typen. Es sieht so aus, als ob der OP weiß, wie man in NSNumbers einpackt, aber BOOLS sind besonders problematisch, weil es leicht ist, falsche y-Werte wie NO no und nil und NSNull instance zu verwechseln.

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

    
danh 03.05.2014 16:12
quelle
1

Wenn das beim Testen passiert, 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).

    
matt 03.05.2014 16:44
quelle
0

Stellen Sie sicher, dass Sie [[NSUserDefaults standardUserDefaults] synchronize] aufrufen, nachdem Sie preferences festgelegt haben und Ihre Einstellungen nicht überschreiben.

    
2intor 03.05.2014 11:45
quelle