2011-08-12 148 views
0

这是我的代码..为什么它不会在设备上添加对象数组? 也许阵列不能从文件读取?我将文件写入文档目录,但可能会出错?谢谢...在模拟器上工作,无法在iPhone设备上工作

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

前6行('如果contactsToProcess == nil {...}')无用,因为您在第6行重新指定了“contactsToProcess”。 – Cyrille

+0

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

+0

它返回Documents目录的路径:NSString * PathforResources(NSString * filename) { \t NSString * leftpart = [filename stringByDeletingPathExtension]; \t NSString * extension = [filename pathExtension]; \t return [[NSBundle mainBundle] pathForResource:leftpart ofType:extension]; \t } 的NSString * DocumentsDirectory() { \t的NSArray *路径= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDirectory,YES); \t return [paths objectAtIndex:0]; \t } 的NSString * fPath() { \t返回[DocumentsDirectory()stringByAppendingPathComponent:@ “quickdial.xml”]; } –

回答

1

我想你应该改变你的代码:

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

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

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

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

我的假设是,您在模拟器上以不同的状态运行程序,并且您的数组已成功归档到文件中。然后您将程序更改为当前状态;在模拟器上它保持工作,因为文件在那里并包含一个存档数组。在设备上,该文件未被创建或只包含nil,因此它不像您期望的那样工作。我建议从设备中删除应用程序(点击应用程序图标,直到进入仪表板编辑模式,然后点击删除按钮);然后应用我上面建议的更改并重新运行。

+0

如何在设备上正确创建文件?我有一个函数,在启动时检查文件是否存在文件direcory中的文件,如果它不存在,则将其复制......奇怪......以及..谢谢 –

+0

它可能取决于内容;如果你存档'nil',你会得到'nil'。我会建议从设备中删除应用程序(长时间点击应用程序图标,然后点击删除按钮),应用我上面建议的更改并重新运行。 – sergio

+0

不是工作?你会尝试我的最后一个代码版本吗?我改变了一点... – sergio

0

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

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

此外,由于设备文件系统区分大小写,因此还要检查不匹配的lower/UPPER情况,因此Mac OS X不是默认设置。

+0

如何进入沙箱?请检查以上更新 –

+0

沙箱是设备上的主目录,所以'〜/'是一个很好的起点。 – PeyloW

+0

不完全是...我应该怎么写filePath呢? –

相关问题