[英]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.