Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串保存到Objective-C(iPhone)中的文件中_Objective C_Iphone_Save - Fatal编程技术网

将字符串保存到Objective-C(iPhone)中的文件中

将字符串保存到Objective-C(iPhone)中的文件中,objective-c,iphone,save,Objective C,Iphone,Save,我似乎遇到了一个关于从字符串保存xml文件的问题(这是在iPhone上完成的) 文件本身存在并包含在项目中(因此在工作区中),我从代码片段中得到的所有指示在emulator上没有任何错误,在iPhone上没有任何错误(错误513),但在任何情况下都不会保存文件 { Hits = config->Hits; NSString* filenameStr = [m_FileName stringByAppendingFormat: @".xml" ]; NSString* pData

我似乎遇到了一个关于从字符串保存xml文件的问题(这是在iPhone上完成的) 文件本身存在并包含在项目中(因此在工作区中),我从代码片段中得到的所有指示在emulator上没有任何错误,在iPhone上没有任何错误(错误513),但在任何情况下都不会保存文件

{
Hits = config->Hits;

NSString*   filenameStr = [m_FileName stringByAppendingFormat: @".xml" ]; 
NSString*   pData = [self getDataString];  // write xml format - checked out ok
NSError     *error;

/* option 2 - does not work as well
 NSBundle        *mainBundle = [NSBundle mainBundle];
 NSURL           *xmlURL = [NSURL fileURLWithPath:[mainBundle pathForResource: m_FileName ofType: @"xml"]];

 if(![pData writeToURL: xmlURL atomically: true encoding:NSUTF8StringEncoding error:&error]) 
 {
 NSLog(@"Houston - we have a problem %s@\n",[error localizedFailureReason]);
 return false;
 }
 */

if(![pData writeToFile: filenameStr atomically: FALSE encoding:NSUTF8StringEncoding error:&error]) 
{
    NSLog(@"Houston - we have a problem %s@\n",[error localizedFailureReason]);
    return false;
}
return true;
}

任何帮助都将不胜感激,
-A

您不应写入应用程序包中包含的文件。在真正的iPhone上,您可能无法执行此操作,因为这些文件都经过数字签名

即使您可以修改打包文件,它也不是存储数据的好地方。从应用商店升级或Xcode生成重新安装应用程序将用原始文件覆盖该文件

而是将XML存储到Documents目录中。您可以获得如下路径:

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
    NSUserDomainMask, YES); 
NSString* documentsDirectory = [paths objectAtIndex:0];     
NSString* leafname = [m_FileName stringByAppendingFormat: @".xml" ]; 
NSString* filenameStr = [documentsDirectory
    stringByAppendingPathComponent:leafname];
如果您的文件需要一些您不想在代码中生成的初始状态,请让您的应用程序在第一次需要它时检查它是否存在于文档目录中,如果缺少,请从包中的模板复制它

存储结构化数据的另一种方法是使用用户默认值。例如:

[[NSUserDefaults standardUserDefaults] setObject:foo forKey:FOO_KEY];

你能给出解释513错误的字符串吗?另外,请注意:在打印localizedFailureReason时,最好在NSLog语句中使用%@而不是%s。%@格式说明符接受一个NSString*,而%s需要一个以null结尾的char*字符串。从技术上讲,%@接受任何NSObject类型,并调用[object description],该字符串本身就是[object description];但它也适用于其他NSObject类型(例如数组、集合等)+1用于用户默认方法。但是,该文件并不能防止覆盖,因为它是数字签名的,而是只读的,不能被覆盖。它们也有数字签名,但这并不是阻止写入的原因。