iOS代码:在其他机器上失败,但不是我的[NSFileManager copyItemAtPath:toPath:error:]:源路径为nil'

时间:2012-10-16 03:23:02

标签: ios file-io nsfilemanager

我正在与一个团队一起开发,使用的mac都是完全相同的。使用我编写代码的机器,我可以以编程方式创建然后写入pList文件。但是当我使用我的家用机器(相同的图像)或我的队友在他们的机器上测试代码时,我们崩溃了 [NSFileManager copyItemAtPath:toPath:error:]:源路径为nil'错误。在调试中,文件路径有效。然而,捆绑包在:

 NSString *bundle = [[NSBundle mainBundle]pathForResource:@"Family" ofType:@"plist"];
    [pListfileMgr copyItemAtPath:bundle toPath: pListpath error:&error];

是零。我们正在使用git来控制我们的代码。我们一直在保存.DS_Store和/ userdata /文件,除非我错过了什么。到底是怎么回事?以下是代码,几乎逐字逐句地从here

中复制
NSError *error;
NSArray *pListpaths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,  YES);

NSString *pListdocumentsDirectory = [pListpaths objectAtIndex:0];

NSString *pListpath = [pListdocumentsDirectory stringByAppendingPathComponent:@"Family.plist"];
NSFileManager *pListfileMgr = [NSFileManager defaultManager];

//Create a plist if it doesn't alread exist
if (![pListfileMgr fileExistsAtPath: pListpath])
{
    NSString *bundle = [[NSBundle mainBundle]pathForResource:@"Family" ofType:@"plist"];
    [pListfileMgr copyItemAtPath:bundle toPath: pListpath error:&error];
}

NSMutableDictionary *thePList = [[NSMutableDictionary alloc] initWithContentsOfFile: pListpath];

[thePList setObject:[NSString stringWithFormat:@"%@", numberOfPeopleInFamilyOfOrigin] forKey:@"famSize"];
[thePList writeToFile: pListpath atomically: YES];

3 个答案:

答案 0 :(得分:1)

我相信你误解了上面列出的代码的意图。

以下块检查是否存在位于路径pListpath的文件。如果pListpath处的文件不存在,则会将文件从 的文件夹中复制到pListpath

//Create a plist if it doesn't alread exist
if (![pListfileMgr fileExistsAtPath: pListpath])
{
    NSString *bundle = [[NSBundle mainBundle]pathForResource:@"Family" ofType:@"plist"];
    [pListfileMgr copyItemAtPath:bundle toPath: pListpath error:&error];
}

也就是说,您必须在捆绑包中发送一个名为Family.plist的文件,目的是如果一个plist尚不存在,该文件将充当默认 plist在路径pListpath

答案 1 :(得分:0)

您的App套件中是否存在Family.plist

Xcode习惯于不将更改(添加)的资源更新到捆绑包中。通常的补救措施是从模拟器/设备上删除应用程序并安装新的应用程序。

如果您的队友在他们的模拟器上安装了较旧的安装,换句话说,一个全新的版本,但第一次安装的时间是在Family.plist添加到项目的时间之前,那么就可以了。

您的队友可以通过导航(在Finder中)Family.plist来验证~/Library/Application Support/iPhone Simulator是否存在,然后执行Show Package Contents yourAppName.app

答案 2 :(得分:0)

在这种情况下,我会尝试一些事情:

打印出pListpath的值,然后检查它是否存在于本地文件系统上,或者目录路径是否被错误构建。

如果路径构造中不存在问题,我会明确创建Family.plist,并确保将其包含在Build Phases > Copy Bundle Resources下。

此外,在共享环境中工作时,通常无法建立和清除项目的派生数据通常有助于解决某些问题。你可以这样做: 1)打开组织者。 2)导航到项目选项卡。 3)在左侧找到并选择您的项目。 4)删除派生数据。