为什么我的数据成功写入iPhone模拟器上的文件,但不是我的设备?

我有下面的代码,将用户的草图数据保存到一个文件…

//Auto Save the sketch NSString *filename = [NSString stringWithFormat:@"%@.png", sketchID]; CGImageRef imageRef = CGBitmapContextCreateImage(paintView.canvas.mBitmapContext); UIImage* image = [[UIImage alloc] initWithCGImage:imageRef]; NSData* imageData = UIImagePNGRepresentation(image); [imageData writeToFile:filename atomically:YES]; CGImageRelease(imageRef); [image release]; 

SketchID是唯一的字母数字值,所以我保存的文件名的一个例子是“p1.png”。 我用来读取文件的代码是…

 //Load the sketch where the user left off, if there is one if(fileName != nil) { UIImage* image = [UIImage imageWithContentsOfFile:fileName]; if(image != nil) { . . 

此代码似乎在模拟器上运行正常,但是当我在设备上运行它,未能加载图像。 我是iOS开发新手,我仍然在学习如何存储文件。 我的问题是…

  1. 为什么要在模拟器上保存/加载文件,而不是设备?
  2. 当我创build我想要保存数据的文件名时,是否还需要在iPhone上的特定目录中包含一个path,以在其中正确存储数据? 或者,当我调用writeToFile:方法时,“p1.png”能够正常工作吗? 那么imageWithContentsOfFile:方法呢?

非常感谢您的帮助!

为什么要在模拟器上保存/加载文件,而不是设备?

有很多原因,但最常见的情况是尝试写入设备上不可写入的位置,最常见的原因是写入应用程序包本身。

所有iPhone应用程序都在设备上“沙盒”,这意味着他们无法访问安装应用程序的目录之外的文件系统。

当我创build我想要保存数据的文件名时,是否还需要在iPhone上的特定目录中包含一个path,以在其中正确存储数据? 或者,当我调用writeToFile:方法时,“p1.png”能够正常工作吗? 那么imageWithContentsOfFile:方法呢?

您可以写入您的应用程序的临时目录(如果您只是需要临时放置某些东西的位置)或Documents目录(如果您需要更长时间地存储某些内容,并且还要通过iTunes进行备份)。

 NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString* documentsDirectory = [paths objectAtIndex:0]; 

我不确定,但是对于我来说,看起来像是保存到应用程序包中。 这改变了捆绑的大小。 但是这会破坏代码签名。

而是写入文档字典: 如何获得iPhone上的可写path?

我发现模拟器是非常宽容的写入文件,但设备当然不是。 我的问题是,我正在创buildfilePath不正确的模拟器没有捕获。 模拟器应该抓住了这个。

这是我的错误和正确的迅速代码

 docsDir!+"filename.dat" // wrong does not have path separator between dir and file docsDir!.stringByAppendingPathComponent("filename.dat") // works since it puts the "/" in between the two.