2010-11-21 24 views
3

'ye gönderileceği zaman çöküyor adlı *favorites adı verilen bir tane var. Bu NSStrings bir dizi ve ben bir .plist dosyasına yazmak istiyorum.Uygulama NSMutableArray öğesinin

ben aradığında:

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

o istisna tip EXC_BAD_ACCESS (SIGBUS) ile ve ben crashlog, Favorites.plist dahil ettik istisna kodu KERN_PROTECTION_FAILURE at 0x00000006

çöküyor ve kod snippet'idir nerede yöntem çağrılıyor. Yardım çok takdir edilecektir!

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 çökmesine neden olan

<?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> 

Yöntem:

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]; 
} 
( cellTitle bir NSString amacı)

cevap

2

iPhone'da uygulama paketindeki bir dosyayı yazamaz veya değiştiremezsiniz. Verileri kaydetmek istiyorsanız, dosyanızı uygulamanızın belgeler dizininde oluşturun. Böyle belgeler dizini alabilirsiniz:

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

Sonra sadece NSString 'ın stringByAppendingPathComponent: yöntemi kullanarak dosya ekleyin.

Uygulamanızdan verilerin nereye kaydedileceği hakkında daha fazla bilgi için Apple'ın Düşük Düzeyli Dosya Yönetimi Programlama Konularına bakın.

+0

Bunu yaptım ve hala çalışmıyor: NSArray * yolları = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); \t NSString * documentsDirectoryPath = [paths objectAtIndex: 0]; \t favPath = [documentsDirectoryPath stringByAppendingPathComponent: @ "Favorites.plist"]; \t favorites = [[NSMutableArray alloc] initWithContentsOfFile: favPath]; – Jakir00

+0

Birkaç soru: Dosya var mı? NSArray'ın 'writeToFile: atomically:' metodu kullanılarak yazılmıştır. Dosya bir plist ise, bunu bir 'NSMutableArray' değil, bir 'NSMutableDictionary' olarak okumalısınız. –

+0

Bu, uygulama tercihlerini depolamak içinse, bunun yerine 'NSUserDefaults' kullanmayı düşünün. –

1

Bu muhtemelen sizin kazınızın sebebi değildir, ancak parçaları pakete geri yazmak çok kötü bir uygulamadır. Çalıştığından bile emin değilim. Uygulama paketi dizini salt okunursa, uygulamanızın yukarıdakilerle çakışması mümkündür.

Bu uygulama paketinden bir başlangıç ​​dosyası okumak için iyi, ama değiştirmek istediğiniz ve veri o zaman Documents dizine yazma gerektiğini devam ederse. Bu, Stack Overflow'ta iyi işlenmiş.

İlgili konular