2010-11-21 6 views
3

J'ai un NSMutableArray appelé *favorites. C'est un tableau de NSStrings et je veux l'écrire dans un fichier .plist.App se bloque lorsque NSMutableArray à plister

Quand j'appelle:

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

il se bloque avec le type d'exception EXC_BAD_ACCESS (SIGBUS) et avec le code d'exception KERN_PROTECTION_FAILURE at 0x00000006

J'ai inclus le crashlog, le Favorites.plist, et un extrait de code où la méthode est appelée. L'aide serait grandement appréciée!

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> 

méthode qui est la cause de l'accident: (cellTitle est un objet 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]; 
} 

Répondre

2

Vous ne pouvez pas écrire ou modifier un fichier dans le lot d'applications sur l'iPhone. Si vous souhaitez enregistrer des données, créez votre fichier dans le répertoire de documents de votre application. Vous pouvez obtenir le répertoire des documents comme celui-ci:

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

Puis, ajoutez votre nom de fichier en utilisant la méthode NSString « s stringByAppendingPathComponent:. Consultez les rubriques de programmation de gestion de fichiers de bas niveau d'Apple pour plus d'informations sur l'emplacement où enregistrer les données de votre application.

+0

Je l'ai fait et cela ne fonctionne toujours pas: NSArray * paths = NSSearchPathForDiriesiesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); \t NSString * documentsDirectoryPath = [paths objectAtIndex: 0]; \t favPath = [documentsDirectoryPath stringByAppendingPathComponent: @ "Favorites.plist"]; \t favorites = [[NSMutableArray alloc] initWithContentsOfFile: favPath]; – Jakir00

+0

Quelques questions: Le fichier existe-t-il? A-t-il été écrit en utilisant la méthode 'writeToFile: atomically:' de 'NSArray'? Si le fichier est un plist, vous devrez le lire dans un NSMutableDictionary, pas un NSMutableArray. –

+0

S'il s'agit de stocker des préférences d'application, utilisez plutôt 'NSUserDefaults' à la place. –

1

Ce n'est probablement pas la cause de votre panne, mais il est très mauvais d'écrire des choses dans le paquet. Je ne suis même pas sûr que cela fonctionne. Si le répertoire du regroupement d'applications est en lecture seule, il est possible que votre application tombe en panne avec ce qui précède.

Il est bon de lire un fichier initial de votre paquet d'applications, mais si vous voulez changer et persistez que les données vous doivent écrire dans le répertoire Documents. Ceci est bien couvert ici sur Stack Overflow.

Questions connexes