NSUserDefaults synchroniser ne pas save sur

J'ai un bogue soumis par un testeur qui s'il exécute une action et redémarre alors son téléphone (en appuyant sur la maison et le button Sleep / Wake pendant quelques secondes) l'application n'est pas l'état persistant.

J'ai été capable de reproduire ce problème. [NSUserDefaults synchronize] est appelé, mais lorsque je redémarre l'application après le redémarrage, la valeur dans NSUserDefaults n'a pas été enregistrée.

Est-ce que quelqu'un sait si synchroniser les magasins à un tampon qui est ensuite enregistré sur le disque? Si oui, comment puis-je vider le tampon (je pensais synchroniser était le même que le flush, mais apparemment pas.)

(edit) En d'autres termes:

assert([[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO); [[NSUserDefaults standardUserDefaults] setBool: YES forKey: MY_KEY]; [[NSUserDefaults standardUserDefaults] synchronize]; 

laissez l'application au premier plan et redémarrez l'appareil après l'appel de ce qui précède, puis redémarrez l'appareil et relancez l'application. L'affirmation devrait tirer la deuxième fois, mais parfois non.

Pour être très précis … J'ai créé une application de vue unique et j'ai mis le code suivant dans viewDidLoad

 #define MY_KEY @"MY_KEY" - (void)viewDidLoad { [super viewDidLoad]; BOOL key = [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY]; NSLog(@"[[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == %@", key ? @"YES" : @"NO"); [[NSUserDefaults standardUserDefaults] setBool: !key forKey: MY_KEY]; [[NSUserDefaults standardUserDefaults] synchronize]; NSLog(@"reboot now."); } 

Voici la sortie de trois courses de l'application:

 2013-05-31 12:17:44.127 syncTest[162:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == YES 2013-05-31 12:17:44.133 syncTest[162:907] reboot now. 2013-05-31 12:18:49.771 syncTest[128:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO 2013-05-31 12:18:49.778 syncTest[128:907] reboot now. 2013-05-31 12:19:41.388 syncTest[124:907] [[NSUserDefaults standardUserDefaults] boolForKey: MY_KEY] == NO 2013-05-31 12:19:41.397 syncTest[124:907] reboot now. 

Notez que la sortie était "OUI, NON, NON" mais cela aurait dû être "OUI, NON, OUI"

J'ai rencontré le même problème et j'identifie que j'ai deux references de l'object [NSUserDefaults standardUserDefaults] sur différentes classs car nsdefault est une class singleton donc celle qui l'a précédée l'aura si on avait déjà la reference de [NSUserDefaults standardUserDefaults] essayez de le terminer à partir de la première reference et laissez l'instance être libre de là et ensuite appelez l'instance à votre autre class et synchronisez, espérons que cela sera fait

Dans mon cas, certaines valeurs que j'ai écrites dans NSUserDefaults ont persisté et d'autres non. Après beaucoup de searchs, j'ai remarqué que la paire key-valeur qui n'avait pas sauvegardé avait une key capipatilisée, c'est-à-dire TheKey vs theKey. Lorsque j'ai changé ma key pour une key en forme de chameau (theKey au lieu de TheKey), la valeur a persisté à travers l'application et s'est relancée. Cela me semble très étrange, mais ça a marché dans mon cas.