15

我将一些运行时生成的文件保存在我的 iOS 应用程序的 .app 包中。在模拟器中它工作正常,在设备中它崩溃:

可以在给定的着色器缓存路径'/var/mobile/Applications/CB064997-B40E-4FE3-9834-B3217CE33489/SimedTest.app/Ogre3D/assets/RTShaderLib/cache/中创建输出文件

是否有一个很好的概述我应该和不应该把文件放在哪里 - 如何使用 Documents、Library 和 tmp 等?

为了澄清,这些是在启动时创建的文件,它们预先计算一些数据以节省时间。如果它们不存在,它们会被创建,所以它们被删除很好,但在应用程序运行时不会。

4

2 回答 2

19

该捆绑包是只读的。你不想弄乱它有两个原因:

  • 代码签名:签名通过捆绑包的内容进行验证;如果你把包弄乱了,你就会破坏签名。
  • 应用程序更新:通过用新下载的应用程序包替换整个应用程序包来进行更新;您所做的任何更改都会丢失。

你应该在哪里保存东西:

  • 文档:如果您希望它保留并备份
  • 库/缓存:如果您只想缓存下载的数据,例如个人资料图片;如果空间不足,系统将自动删除,除非您使用特殊的不删除标志指定。
  • tmp:临时文件,在您的应用未运行时删除

有关完整说明,请查看文件系统编程指南QA1719

于 2012-10-01T19:14:04.987 回答
4

不,每次您更改捆绑包时,都会使您的签名无效。

如果要写入文件,则需要根据要对该文件执行的操作将其写入最佳文件夹。

  1. 用于长期文件的 Documents 文件夹
  2. 小型操作的缓存
  3. 等等

编辑

要获得path你需要这样的东西:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"filename.ext"];

有了这个path,你可以这样写或读:

写:

NSString *content = @"One\nTwo\nThree\nFour\nFive";
[content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];

读:

NSString *content = [[NSString alloc] initWithContentsOfFile:fileName usedEncoding:nil error:nil];
于 2012-10-01T19:10:43.540 回答