繁体   English   中英

适用于模拟器,不适用于 iPhone 设备

[英]Works on Simulator, doesn't work on the iPhone device

这是我的代码..为什么它不会在设备上添加 object 到阵列中? 也许无法从文件中读取数组? 我将文件写入文档目录,但可能有什么问题? 谢谢...

if (contactsToProcess==nil)
    {
    contactsToProcess=[[NSMutableArray alloc] init];
    NSLog(@"Array with objs initialized");
    }
    contactsToProcess=[NSKeyedUnarchiver unarchiveObjectWithFile:fPath()];
    [contactsToProcess addObject:cont];
    NSLog(@"Object added to file:");
    for(Contact *cn in contactsToProcess)
    {
        NSLog(@"%@", cn.fName);
    }

        [NSKeyedArchiver archiveRootObject:contactsToProcess toFile:fPath()];

fPath() 会:

NSString* PathforResources(NSString* filename)
{
    NSString *leftpart=[filename stringByDeletingPathExtension];
    NSString *extension=[filename pathExtension];
    return [[NSBundle mainBundle] pathForResource:leftpart ofType:extension];

}
NSString* DocumentsDirectory()
{
    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDirectory, YES);
    return [paths objectAtIndex:0];

}
NSString* fPath()
{
    return [DocumentsDirectory() stringByAppendingPathComponent:@"quickdial.xml"];
}

我想您应该将代码更改为:

contactsToProcess=[NSKeyedUnarchiver unarchiveObjectWithFile:fPath()];
if (contactsToProcess==nil)
{
  contactsToProcess=[[NSMutableArray alloc] init];
  NSLog(@"Array with objs initialized");
}
...

那么一切都应该工作。 一些解释:您发布的代码只有在文件quickdial.xml已经存在时才能按预期工作; 它将无法创建具有适当内容的文件(或根本无法创建它,我不知道归档nil指针的确切效果是什么)。 实际上,当文件不存在时,执行原始代码后:

if (contactsToProcess==nil)
{
contactsToProcess=[[NSMutableArray alloc] init];
NSLog(@"Array with objs initialized");
}
contactsToProcess=[NSKeyedUnarchiver unarchiveObjectWithFile:fPath()];

contactsToProcess将为零; 这意味着对其进行的所有后续操作都将无效,并且您正在归档一个nil指针。 即,当文件不存在时,它不会像您期望的那样使用数组创建。 这就是您的设备上发生的情况。

我的假设是您在模拟器上以不同的 state 运行程序,并且您的数组已成功存档到文件中。 然后你把程序改成现在的state; 在模拟器上它继续工作,因为文件在那里并且包含一个存档数组。 在设备上,文件未创建或仅包含nil ,因此无法按预期工作。

我建议从设备中删除该应用程序(点击应用程序图标,直到您进入仪表板编辑模式,然后点击删除按钮); 然后应用我上面建议的更改并重新运行。

fPath()返回的路径是什么?

在模拟器上,您可以访问完整的文件系统(至少在您登录的 Mac OS X 用户可以访问的范围内) ,在设备上只能访问沙盒主目录。

还要检查不匹配的小写/大写,因为设备文件系统区分大小写,Mac OS X 默认不区分大小写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM