CFPreferences创建多个文件

时间:2010-03-18 08:41:58

标签: objective-c cocoa preferences

我只有一个小问题:

为什么CFPreferences-API会在我的UserPrefs-Directory中创建多个文件?所有文件都有我的Bundle-Identifier作为名称,所有文件(除了原文之外)都添加了这样的后缀:

  • com.myComp.myApp.plist< - (只应创建此plist文件)
  • com.myComp.myApp.plist.0qzcicc
  • com.myComp.myApp.plist.8dhjfht

2 个答案:

答案 0 :(得分:3)

这看起来非常像原子写作的副作用。

原子写入意味着,无论何时从NSData(或其他)对象写入文件,都首先使用同一目录中的临时文件名创建该文件。然后将所有数据写入该文件(通常不是原子的操作)。关闭文件后,它将重命名为原始文件名。重命名是一个原子步骤,可确保可能查看该文件的任何其他进程看到完整的旧文件或完整的新文件。进程无法只看到文件的一半。

有趣的命名文件看起来像是来自此过程的工件。也许你的应用程序在原子写入过程中崩溃了?

答案 1 :(得分:1)

如果您在关闭应用时进行同步,例如:

- (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.
}

它将首先尝试写入虚拟文件并在之后进行原子重命名。如果写作时间很长,你最终会得到一个虚拟文件。

在我的情况下,我有一些用户有14mb plists并最终有很多虚拟文件(几乎2G)。

我的问题和解决方法是压缩我写入userdefaults的图像。