writeToFile在iphone上失败但在模拟器上运行

时间:2010-01-19 08:15:31

标签: iphone

NSString *myfile = [[NSBundle] mainBundle] pathForResource:@"fileName" ofType:@"plist"];    
NSMutableArray *mydata= [[NSMutableArray alloc] initWithContentsOfFile:myfile];

/* code to modify mydata */

[mydata writeToFile:myfile atomically:YES]

如果模拟器'fileName.plist'被修改但是在iphone设备文件保持不变的情况下。也不例外。

上述代码是否可以在iphone和模拟器上正常工作?

同样在调试器中,当我将鼠标悬停在'mydata'上时,我会看到模拟器和设备的不同值。在模拟器的情况下,我看到例如'5个对象'但是在实际设备的情况下它显示'{(int)[$VAR count]}'。这可能与文件没有被写入有关吗?

1 个答案:

答案 0 :(得分:5)

您无法写入包的资源目录中的文件。最重要的是你不想要,因为更新你的应用程序时会覆盖任何更改。文档目录在各个版本中都存在,并且(我相信)它通过itunes备份。

这是一个片段,用于检查plist的文档目录。如果该文件不存在,则将资源中的plist复制到文档目录中。

BOOL success;
NSFileManager* fileManager = [NSFileManager defaultManager]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"score.plist"];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success) return success;
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"score.plist"]];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
return success;