Reputation: 2073
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
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
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