Почему NSUserDefaults оставляет временные файлы plist в библиотеке /настройках моего приложения?

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

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

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

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

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

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

EDIT:

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

Хотя я согласен с идеей ответчиков, она не объясняет «почему?» часть.

7 голосов | спросил bsneed 30 ThuEurope/Moscow2010-12-30T11:06:18+03:00Europe/Moscow12bEurope/MoscowThu, 30 Dec 2010 11:06:18 +0300 2010, 11:06:18

3 ответа


0

Я убедился, что это ошибка 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;
}
ответил bsneed 5 Jam1000000amWed, 05 Jan 2011 08:58:58 +030011 2011, 08:58:58
0

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

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

ответил 30 ThuEurope/Moscow2010-12-30T11:35:07+03:00Europe/Moscow12bEurope/MoscowThu, 30 Dec 2010 11:35:07 +0300 2010, 11:35:07
0

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

ответил Dad 2 Jam1000000amSun, 02 Jan 2011 00:38:25 +030011 2011, 00:38:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132