2010-12-30 12 views
7

Tengo problemas para entender por qué NSUserDefaults está dejando archivos de basura en Biblioteca/Preferencias para mi aplicación.¿Por qué NSUserDefaults deja archivos plist temporales en Library/Preferences para mi aplicación?

que estoy viendo los siguientes archivos ...

com.mycompany.myapp.plist 
com.mycompany.myapp.plist.3gaPYul 
com.mycompany.myapp.plist.c97yxEH 

... etc. Los archivos plist.* son 0 bytes. Parece que cada vez que se ejecuta la aplicación, deja una nueva detrás. Me aseguré de no llamar al -[NSUserDefaults synchronize] en absoluto, sin embargo, si lo llamo, acelera el aspecto de los archivos basura para una ejecución determinada. Pasando por un depurador, tan pronto como paso por encima de la llamada para sincronizar, aparece un nuevo archivo. Si elimino la llamada de sincronización, a veces aparece un nuevo archivo no deseado en el inicio de la aplicación y otras veces en la aplicación se cierra.

También estoy verificando si tal vez estoy configurando un usuario predeterminado en un hilo (poco probable, pero quizás una posibilidad), pensó que los documentos dicen que es seguro para subprocesos.

Cualquier ayuda es apreciada. ¡Gracias!

EDIT:

Sólo encontraron esta: "¿Por qué" CFPreferences creates multiple files

Aunque estoy de acuerdo con la idea que responden, no explica la parte.

+0

Eso es bastante loco; ¡avíseme si alguna vez descubre por qué! –

+0

He tenido exactamente el mismo problema, con las listas temporales que realmente terminan llenando completamente el iPad (miles de ~ 4Mb archivos que terminan representando múltiples Gb). Definitivamente parece un error de iOS. – quentinadam

Respuesta

3

Me he convencido de que se trata de un error de Apple, pero no he podido crear una pequeña muestra que lo ilustre. Recibí un montón de comentarios diciendo que las propias aplicaciones de Apple hacen esto. Desde que choqué contra una pared y necesito seguir moviéndome, terminé haciendo un hack desagradable que se muestra a continuación.

@implementation NSUserDefaults(Hack) 

- (BOOL)synchronize 
{ 
BOOL result = CFPreferencesAppSynchronize((CFStringRef)[[NSBundle mainBundle] bundleIdentifier]); 
if (!result) 
{ 
    // there's probably a temp file lingering around... try again. 
    result = CFPreferencesAppSynchronize((CFStringRef)[[NSBundle mainBundle] bundleIdentifier]); 

    // regardless of the result, lets clean up any temp files hanging around.. 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *prefsDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Preferences"]; 
    NSDirectoryEnumerator *dirEnumerator = [fileManager enumeratorAtPath:prefsDir]; 
    NSString *file = nil; 
    NSString *match = [[[NSBundle mainBundle] bundleIdentifier] stringByAppendingString:@".plist."]; 
    while ((file = [dirEnumerator nextObject])) 
    { 
     if ([file rangeOfString:match].location != NSNotFound) 
     { 
      NSString *fileToRemove = [prefsDir stringByAppendingPathComponent:file]; 
      [fileManager removeItemAtPath:fileToRemove error:nil]; 
     } 
    } 
} 

return result; 
} 
+1

He tenido exactamente el mismo problema, con las listas temporales que terminan llenando completamente el iPad (miles de archivos de ~ 4Mb que terminan representando múltiples Gb). Definitivamente un error de iOS. – quentinadam

1

¿Estos archivos plist persisten entre los inicios de la aplicación? ¿Estás teniendo errores al almacenar preferencias? ¿Su oficial plist tiene permisos de escritura habilitados?

Las listas de propiedades pueden escribirse atómicamente, lo que significa que primero se escriben en un archivo temporal y, si no hay ningún error durante la operación de escritura, el archivo temporal se renombra al nombre del archivo original. En circunstancias normales, no debería ver los archivos temporales.

+0

Los archivos plist persisten entre los lanzamientos. No veo ningún error al almacenar datos, y los permisos de escritura son correctos. He visto los archivos temporales ir y venir en otras aplicaciones (parecía normal que desaparezcan). Llevo años haciendo esto y es la primera vez que veo este comportamiento, así que realmente me puse a rascarme la cabeza. Gracias por las sugerencias, no había pensado en verificar los permisos. – bsneed

1

Pensamiento: ¿los datos que está almacenando están escritos en el archivo correctamente nombrado? Creo que insinuaste que lo es. Me pregunto si el archivo con el nombre correcto está abierto con permisos de escritura por algo que no sea NSDefaults y si eso está bloqueando la copia segura para guardar desde la fase del archivo temporal.

+0

La estrategia de depuración habitual se aplica, por supuesto; copie la carpeta completa del proyecto y comience a simplificar tirando cosas poco a poco y vea cuándo se detiene el comportamiento. Hazlo lo suficientemente simple y encontrarás tu error o tendrás un buen programa de demostración para el reportero de errores de Apple: -/ – Dad

+0

Los datos están llegando al archivo correcto.No veo que exista ningún código que abra explícitamente ese archivo dentro de Gity, pero seguiré buscando eso. – bsneed

+0

¿Hay alguna posibilidad de que su aplicación no ejecute el ciclo de ejecución normal? (como solo el ciclo de ejecución modal o algo así). O hmm, me pregunto si estás actualizando los valores predeterminados de múltiples hilos muy a menudo y estás viendo algún tipo de condición de carrera donde el segundo no ocurre porque el primero está en el medio de pasar (o algo) ... Parece más como un error del sistema operativo en este punto ... – Dad

Cuestiones relacionadas