Работает на симуляторе, не работает на устройстве iPhone - PullRequest
0 голосов
/ 12 августа 2011

Вот мой код .. почему он не собирается добавлять объект в массив, когда на устройстве? Может быть, массив не может быть прочитан из файла? Я записываю файл в каталог документов, но что может быть не так? БЛАГОДАРЯ ...

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 ]

1 голос
/ 12 августа 2011

Полагаю, вам следует изменить код на:

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, поэтому он не работает должным образом.

Я бы предложил удалить приложение с устройства (нажимайте на значок приложения, пока не войдете в режим редактирования панели мониторинга, затем нажмите на кнопку удаления); затем примените предложенное выше изменение и повторите процедуру.

0 голосов
/ 12 августа 2011

Какой путь возвращает fPath()?

В Simulator у вас есть доступ к полной файловой системе (по крайней мере, насколько вы можете войти в систему в Mac OS X) , на устройстве только в изолированную домашнюю директорию.

Также проверьте наличие несоответствующего нижнего / верхнего регистра, поскольку файловая система устройства чувствительна к регистру, Mac OS X по умолчанию не используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...