ios objective-c xcode nsuserdefaults ios10
https://www.dropbox.com/s/j7vbgl6e15s57ix/nsuserdefaultbug.zip?dl=0

iOS 10 con XCode 8 GM hizo que NSUserDefaults no funcionara intermitentemente



objective-c ios10 (2)

NOTA: He visto muchas otras publicaciones en Stack Overflow sobre el NSUserDefaults nombre de UserDefaults a UserDefaults en Swift o no trabajar en el simulador hasta que se reinicie. Esto no es un duplicado de todos modos. Muchas de las preguntas contra las que se está etiquetando es de hace 4 años. Mi pregunta es específica para iOS 10 de este año, ya que siempre ha funcionado en versiones anteriores. Ya mencioné en mi pregunta que mi pregunta no es un duplicado de esas preguntas, ya que fueron errores del simulador en Swift y mi problema está en el objetivo C del dispositivo. Por favor, lea las preguntas antes de marcar como duplicado

Mi problema es diferente, ya que puedo reproducirlo en el objetivo C y en el propio dispositivo físico.

Creé un nuevo proyecto desde cero para esta prueba. viewDidLoad este código en el viewDidLoad de un controlador de vista:

if (![[NSUserDefaults standardUserDefaults] valueForKey:@"checkIfInitialized"]){ NSLog(@"setting checkIfInitialized as not exist"); [[NSUserDefaults standardUserDefaults] setValue:@"test" forKey:@"checkIfInitialized"]; [[NSUserDefaults standardUserDefaults] synchronize]; self.view.backgroundColor=[UIColor redColor]; self.mylabel.text=@"NSUserDefaults was NOT there, try running again"; } else { NSLog(@"checkIfInitialized exists already"); self.view.backgroundColor=[UIColor blueColor]; self.mylabel.text=@"NSUserDefaults was already there this time, try running again"; }

Ahora, si ejecuto la aplicación aproximadamente 10 veces, pocas veces encuentra el checkIfInitialized y algunas veces no lo hace. No hay un número exacto de cuántas veces falla, ya que podría funcionar 3 veces, luego fallar las siguientes 2 veces, luego trabajar 4 veces y fallar una vez y así sucesivamente.

Ahora algo que he notado (aunque no estoy 100% seguro) de que el problema solo parece ocurrir cuando estoy haciendo pruebas conectadas a través de Xcode. Si ejecuto iniciando la aplicación haciendo clic en el ícono de la aplicación en el dispositivo sin Xcode, entonces parece que funciona bien, pero no puedo estar 100% seguro.

Noté que este error ocurre a veces:

[User Defaults] Failed to write value for key checkIfInitialized in CFPrefsPlistSource<0x1700f7200> (Domain: com.xxxx.appname, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)): Path not accessible, switching to read-only

Tengo este proyecto muy simple en mi dropbox si quieres probarlo. Yo sugeriría probar unas 10-15 veces para reproducir este problema.

https://www.dropbox.com/s/j7vbgl6e15s57ix/nsuserdefaultbug.zip?dl=0

Esto funciona completamente bien en iOS 9, así que definitivamente hay algo que ver con iOS 10.

Corrección de error de edición : 28287988

Respuesta del equipo de Apple DTS:

En primer lugar, primero debe determinar si StandardUserDefaults o valueForKey está fallando. Mi conjetura es que "standardUserDefaults" está devolviendo NULL y, si ese es el caso, entonces es algo contra lo que deberías protegerte. En particular, standardUserDefaults devolverá NULL si el archivo de preferencias está cifrado en el entorno en el que se está ejecutando actualmente la aplicación (por ejemplo, las preferencias se establecen en "NSFileProtectionComplete" y la aplicación se ejecuta en segundo plano). Eso no debería ser un problema para las aplicaciones estándar solo para el primer plano, pero es algo que debe tener en cuenta de todos modos.

Es muy probable que Xcode esté induciendo el problema aquí. Xcode complica enormemente el entorno de lanzamiento de la aplicación de una manera que es MUY diferente a un lanzamiento de la aplicación estándar. Mi conjetura es que esto básicamente se desencadena por la sincronización de Xcode que induce una situación esperada durante el lanzamiento de la aplicación, pero si desea una prueba más formal de eso, intente establecer un único punto de interrupción en applicationDidFinishLunching y continúe en el depurador tan pronto como lo golpee. . Mi conjetura es solo agregar que interrumpe el tiempo suficiente para evitar que el problema suceda. Una especie de Es iOS 10 solo en el sentido de que iOS 9 nunca imprimirá ese mensaje de registro, pero eso se debe a que el mensaje de registro se agregó en iOS 10. El código en sí mismo es lo suficientemente similar a iOS 9.3 que sospecho que exactamente el mismo comportamiento es (al menos en teoría) posible en iOS 9.


Sí, este es definitivamente un error reproducible.

  • Sucede con el lanzamiento de GM de Xcode 8 y iOS 10.
  • No es la pregunta vinculada que se refiere a Swift.
  • No es la pregunta vinculada que se refiere a las versiones beta del simulador.

El error ocurre en los dispositivos y en el simulador. Es intermitente: el ahorro funcionará seis veces y luego fallará. A diferencia de usted, no recibí el mensaje "no se pudo escribir la clave".

El error también se produce cuando se opera directamente en el dispositivo sin Xcode. Así es como lo descubrí.

Debes informar un error a Apple , especialmente porque tienes un programa corto que lo reproducirá. Voy a hacer lo mismo.

Una diferencia clave: en mi caso, la falla está en escribir el predeterminado. El valor escrito previamente permanece en NSUserDefaults. A veces, una tecla se escribe con éxito mientras que otra no se modifica.


Una respuesta DTS igualmente muy inteligente de mi propia solicitud de soporte. Básicamente, matar usando Xcode es más asesino que cualquier cosa que ocurra naturalmente en el dispositivo (incluso el método de doble clic de inicio y clic) y dado que todo se bloquea bruscamente cuando Xcode lo detiene, la escritura perezosa de NSUserDefaults puede fallar, O estar solo a medio completar.

Y, de hecho, las pruebas puras en el dispositivo de la aplicación, sin Xcode involucrado, muestran que todo se escribe correctamente en NSUserDefaults cuando se termina la aplicación.

He cerrado mi propio informe de errores.