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

时间:2011-08-12 09:27:32

标签: iphone objective-c xcode

这是我的代码..为什么它不能在设备上添加对象到数组? 也许数组无法从文件中读取?我把文件写到文件目录,但可能出错了?感谢...

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"];
}

2 个答案:

答案 0 :(得分:1)

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

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指针。即,当文件不存在时,将不会像您期望的那样使用数组创建它。这就是您的设备上发生的事情。

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

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

答案 1 :(得分:0)

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

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

同时检查不匹配的lower- / UPPER-case,因为设备文件系统区分大小写,默认情况下不支持Mac OS X.