App вылетает, когда NSMutableArray для plist - PullRequest
3 голосов
/ 22 ноября 2010

У меня есть NSMutableArray, называемый *favorites.Это массив NSStrings, и я хочу записать его в файл .plist.

Когда я вызываю:

favPath = [[NSBundle mainBundle] pathForResource:@"Favorites" ofType:@"plist"];
[favorites writeToFile:favPath automatically:YES];

, происходит сбой с типом исключения EXC_BAD_ACCESS (SIGBUS) ис кодом исключения KERN_PROTECTION_FAILURE at 0x00000006

Я включил аварийный журнал, список Favorites.plist и фрагмент кода, где вызывается метод.Помощь будет высоко ценится!

Crashlog:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000006
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x000034f8 objc_msgSend + 24
1   Foundation                      0x00011ae6 _NSWriteBytesToFileWithExtendedAttributes + 56
2   Foundation                      0x00011aa0 _NSWriteBytesToFile + 20
3   Foundation                      0x00011a60 -[NSData(NSData) writeToFile:atomically:] + 60
4   Foundation                      0x00049124 -[NSArray(NSArray) writeToFile:atomically:] + 148
5   CoderPlus                       0x00005a7a -[HTMLViewController tableView:didSelectRowAtIndexPath:] (HTMLViewController.m:277)
6   UIKit                           0x000c3f98 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 884
7   UIKit                           0x000d4084 -[UITableView _userSelectRowAtIndexPath:] + 196
8   Foundation                      0x00088334 __NSFireDelayedPerform + 360
9   CoreFoundation                  0x00074256 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 10
10  CoreFoundation                  0x00076966 __CFRunLoopDoTimer + 1038
11  CoreFoundation                  0x000773ea __CFRunLoopRun + 1178
12  CoreFoundation                  0x0001e0bc CFRunLoopRunSpecific + 220
13  CoreFoundation                  0x0001dfca CFRunLoopRunInMode + 54
14  GraphicsServices                0x00003f88 GSEventRunModal + 188
15  UIKit                           0x00007b40 -[UIApplication _run] + 564
16  UIKit                           0x00005fb8 UIApplicationMain + 964
17  CoderPlus                       0x0000837a main (main.m:14)
18  CoderPlus                       0x00002c38 start + 32

Favorites.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>

</array>
</plist>

Метод, вызывающий сбой: (cellTitle - это NSString объект)

if (favButtonActive == [NSNumber numberWithInt: 1]) {
    // Write selection to Favorites.plist
    if ([favorites containsObject:cellTitle]) {
        [favorites removeObject:cellTitle];
    } else {
        [favorites addObject:cellTitle];
    }
    [favorites writeToFile:favPath atomically:YES];
    [table reloadData];
}

Ответы [ 2 ]

2 голосов
/ 22 ноября 2010

Вы не можете записать или изменить файл в комплекте приложений на iPhone.Если вы хотите сохранить данные, создайте свой файл в каталоге документов для вашего приложения.Вы можете получить каталог документов следующим образом:

NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

Затем просто добавьте свое имя файла, используя метод NSString stringByAppendingPathComponent:.

Проверьте низкоуровневое программирование управления файлами AppleТемы для получения дополнительной информации о том, где сохранять данные из вашего приложения.

1 голос
/ 22 ноября 2010

Вероятно, это не причина вашего сбоя, но очень плохая практика - записывать вещи обратно в пакет. Я даже не уверен, что это работает. Если каталог пакета приложения доступен только для чтения, возможно, ваше приложение завершится с ошибкой, описанной выше.

Хорошо читать исходный файл из вашего пакета приложения, но если вы хотите изменить и сохранить эти данные, тогда вы должны записать их в каталог Documents. Это хорошо описано здесь, на переполнении стека.

...