NSUserDefaults objectForKey a veces nulo

Acabo de notar que una key que existe en mi **NSUserDefaults** está devolviendo nil con bastante frecuencia. Parece que la mitad de las veces es correcto y la otra mitad no. Digo la mitad del time, pero no me refiero a que sea un fracaso, es solo 40-50%. No lo veo funcionar. Cuando escribo el valor inicial, llamo a sincronizar de inmediato. Utilizo esta key como la revisión de aplicaciones que establezco cuando se registra un nuevo usuario.

El siguiente código devuelve nil:

 #define kDBrevision @"revision" NSString *rev = [[NSUserDefaults standardUserDefaults] objectForKey:kDBrevision]; 

Cuando ejecuto la aplicación y solo superviso el valor (sin escribir ningún NSUserDefaults), el valor a veces es válido sin modificaciones en NSUserDefaults.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSString *r = [[NSUserDefaults standardUserDefaults] objectForKey:kDBrevision]; NSLog(@"revision %@", r); _exit(1); 

No tengo idea de por qué esto está sucediendo. Estoy ejecutando iOS 10 en mi dispositivo conectado a Xcode 8.2.1. ¿Alguien tiene alguna idea? Gracias

EDIT: Comencé a hablar con Apple sobre cómo solucionar esto y descubrí que si tiene la protección de files completa, puede ser la causa de que este problema aparezca de vez en cuando; sin embargo, Apple me dijo que mi caso particular (que es el solo uno de los que estaba seguro en este momento) es un error. El caso es que cuando usas Xcode para iniciar la aplicación en el dispositivo no debe fallar así y de vez en cuando lo hace. No sé cuándo o si será corregido. En su lugar, moví mis cadenas críticas de los valores pnetworkingeterminados al llavero en su lugar.

Esto parece ser un error Xcode 8 y / o iOS 10. Me encontré con él y concluyó de forma concluyente el caso a UserDefaults de forma intermitente devolviendo cero cuando en realidad había datos para la key. Específicamente, configuré los datos una vez, luego eliminé la lógica de configuration y ejecuté solo la lógica get, repetidamente, y algunas veces obtuve valores, algunas veces obtuve nulos.

Cambié mi esquema de ejecución para usar la configuration de liberación y ejecuté la aplicación en el dispositivo sin el depurador conectado y el problema desapareció, es decir, la lógica de obtención produjo el valor correcto cada vez que lo ejecuté (~ 30 veces).

Aquí hay más discusión:

iOS 10 con XCode 8 GM provocó que NSUserDefaults no funcionara intermitentemente

iOS 10, NSUserDefaults no funciona

https://forums.developer.apple.com/thread/48700

https://forums.developer.apple.com/message/143155#143155

testing debajo el código en didFinishLaunchingWithOptions

Swift 3.0

 UserDefaults.standard.synchronize() 

Obective – C

 [[NSUserDefaults standardUserDefaults] synchronize];