这是我的代码..为什么它不能在设备上添加对象到数组? 也许数组无法从文件中读取?我把文件写到文件目录,但可能出错了?感谢...
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"];
}
答案 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.