Почему NSUserDefaults оставляет временные файлы plist в Library / Preferences для моего приложения? - PullRequest
7 голосов
/ 30 декабря 2010

У меня проблемы с выяснением, почему NSUserDefaults оставляет ненужные файлы plist в Library / Preferences для моего приложения.

Я вижу следующие файлы ...

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

... и т. Д. Файлы plist.* имеют размер 0 байт.Кажется, что каждый раз, когда приложение запускается, оно оставляет новое.Я удостоверился, что вообще не звоню -[NSUserDefaults synchronize], однако, если я его вызываю, это ускоряет появление ненужных файлов для данного прогона.Проходя через отладчик, как только я перехожу через вызов для синхронизации, появляется новый файл.Если я отключаю вызов синхронизации, новый файл нежелательной почты иногда появляется при запуске приложения, а иногда при выходе из приложения.

Я также проверяю, возможно, я устанавливаю пользовательское значение по умолчанию для потока (маловероятно, но, возможно, возможно), - подумали доктора, утверждая, что это потокобезопасно.

Любая помощь приветствуется.Спасибо!

РЕДАКТИРОВАТЬ:

Просто нашел это: CFPreferences создает несколько файлов

Хотя я согласен с идеей ответчиков, это не объясняет"Зачем?"часть.

Ответы [ 3 ]

3 голосов
/ 05 января 2011

Я убедился, что это ошибка Apple, но мне не удалось создать небольшой пример, иллюстрирующий это. Я получил массу отзывов о том, что собственные приложения Apple делают это. Поскольку я как бы врезался в стену и мне нужно продолжать двигаться, я закончил тем, что совершил неприятный хак, показанный ниже.

@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 голос
/ 02 января 2011

Мысль - записываемые вами данные записываются в файл с правильным именем?Я думаю, что вы подразумевали, что это так.Мне интересно, если файл с правильным именем открыт с правами на запись чем-то, кроме NSDefaults, и блокирует ли это безопасное копирование с фазы временного файла?

1 голос
/ 30 декабря 2010

Сохраняются ли эти plist-файлы между запусками приложений?У вас есть ошибки при сохранении настроек?Имеются ли у official plist разрешения на запись?

Списки свойств могут быть записаны атомарно, что означает, что они сначала записываются во временный файл и, если во время операции записи нет ошибок,временный файл переименовывается в исходное имя файла.В обычных обстоятельствах вы не должны видеть временные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...