CFPreferences создает несколько файлов

У меня только маленький вопрос:

Почему CFPreferences-API создает несколько файлов в моем UserPrefs-Directory? Все файлы имеют мой Bundle-Identifier в качестве имени, и все (кроме одного, оригинального) добавили такой суффикс:

  • com.myComp.myApp.plist ‹- (должен быть создан только этот plist-файл)
  • com.myComp.myApp.plist.0qzcicc
  • com.myComp.myApp.plist.8dhjfht

person Nobik    schedule 18.03.2010    source источник


Ответы (2)


Это очень похоже на побочный эффект атомарного письма.

Атомарная запись означает, что всякий раз, когда файл должен быть записан из NSData (или другого) объекта, файл сначала создается с использованием временного имени файла в том же каталоге. Затем все данные записываются в этот файл (операция, которая обычно не является атомарной). После закрытия файла он переименовывается в исходное имя файла. Переименование является атомарным шагом, который гарантирует, что любой другой процесс, который может просматривать файл, увидит либо полностью старый файл, либо полностью новый файл. Не может быть, чтобы процесс мог видеть только половину файла.

Файлы с забавными именами выглядят так, будто это артефакты этого процесса. Может быть, ваше приложение рухнуло во время атомарной записи?

person Nikolai Ruhe    schedule 18.03.2010
comment
Привет, мне просто интересно, где находится файл настроек, если вы решите создать его с помощью kCFPreferencesAnyUser? Благодарность - person Zohar81; 08.08.2018

Если вы выполняете синхронизацию при закрытии приложения, например:

- (void)applicationWillResignActive:(UIApplication *)application
{
    [[NSUserDefaults standardUserDefaults] synchronize];
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

Сначала он попытается записать в фиктивный файл, а затем выполнить атомарное переименование. Если написание займет слишком много времени, вы получите фиктивный файл.

В моем случае у меня было несколько пользователей с 14-мегабайтными списками, и в итоге у меня было много фиктивных файлов (занимающих почти 2 ГБ).

Моя проблема и решение заключались в том, чтобы сжать изображение, которое я записал в userdefaults.

person Sjoerd Perfors    schedule 16.03.2015