Jakir00
Jakir00

Reputation: 2073

App Crashes when NSMutableArray to plist

I have an NSMutableArray called *favorites. It is an array of NSStrings and I want to write it to a .plist file.

When I call:

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

it crashes with the exception type EXC_BAD_ACCESS (SIGBUS) and with the exception code KERN_PROTECTION_FAILURE at 0x00000006

I have included the crashlog, the Favorites.plist, and a snippet of code where the method is being called. Help would be highly appreciated!

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>

Method that's causing the crash: (cellTitle is an NSString object)

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];
}

Upvotes: 3

Views: 828

Answers (2)

James Huddleston
James Huddleston

Reputation: 8448

You cannot write or modify a file in the application bundle on the iPhone. If you want to save data, create your file in the documents directory for your application. You can get the documents directory like this:

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

Then, just append your filename using NSString's stringByAppendingPathComponent: method.

Check out Apple's Low-Level File Management Programming Topics for more information on where to save data from your application.

Upvotes: 2

Stefan Arentz
Stefan Arentz

Reputation: 34935

This is probably not the cause of your crash, but it is very bad practice to write stuff back to the bundle. I'm not even sure that works. If the app bundle directory is read-only then it is possible that your app crashes with the above.

It is fine to read an initial file from your app bundle, but if you want to change and persist that data then you must write it to the Documents directory. This is well covered here on Stack Overflow.

Upvotes: 1

Related Questions